我正在尝试在 CMAKE 的帮助下将一些 MSVC 项目移植到 Linux。 在其中一个库项目中,有一些函数刚刚声明,并未在任何地方定义或在任何地方使用。 例如:
int fun_a();
int fun_unsed() /*This function is never used in project*/
{
fun_a();
}
现在,当我尝试在 Linux 中执行 make 时,我观察到对已声明函数的 undefined reference 。但相同的代码可以在具有相同 CMAKE 文件的 MSVC 上运行。
我尝试在我的 CMAKE 文件中使用以下标志(来自 here ),但它似乎没有帮助。
SET(GCC_COVERAGE_COMPILE_FLAGS "-unresolved-symbols=ignore-all")
SET(GCC_COVERAGE_LINK_FLAGS "-unresolved-symbols=ignore-all")
SET( CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} ${GCC_COVERAGE_COMPILE_FLAGS}" )
SET( CMAKE_EXE_LINKER_FLAGS "${CMAKE_EXE_LINKER_FLAGS} ${GCC_COVERAGE_LINK_FLAGS}" )
我错过了什么吗?
下面是可执行文件的cmake文件
#Add Library Projects to the test application
add_subdirectory ("${PROJECT_BINARY_DIR}/../../src/build/vc/" "${PROJECT_BINARY_DIR}/../../src/build/vc/")
#set additional search paths for libraries
#set(CMAKE_LIBRARY_PATH ${PROJECT_BINARY_DIR}/../../lib/Debug)
link_directories(${PROJECT_BINARY_DIR}/../../lib ${OPENCV_BUILD}/lib)
#set ignore undefined & unused functions errors. It seems GCC by defalt looks for them.
SET(GCC_COVERAGE_LINK_FLAGS "-unresolved-symbols=ignore-all")
SET(GCC_COVERAGE_COMPILE_FLAGS "-ffunction-sections")
SET(GCC_COVERAGE_LINK_FLAGS "-Wl,-gc-sections -flto")
SET( CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} ${GCC_COVERAGE_COMPILE_FLAGS}" )
SET( CMAKE_EXE_LINKER_FLAGS "${CMAKE_EXE_LINKER_FLAGS} ${GCC_COVERAGE_LINK_FLAGS}" )
#Get the exicutable for source files
add_executable (FaceAnalysis ${sources})
target_link_libraries (FaceAnalysis faceDetect.a libopencv_core.so libopencv_imgproc.so libopencv_imgcodecs.so libopencv_videoio.so libopencv_objdetect.so libopencv_highgui.so libopencv_video.so libopencv_ml.so SDL2)
add_dependencies(FaceAnalysis faceDetect)
最佳答案
如果它们确实未被引用,您就不会收到“ undefined reference ”错误。
链接器错误应该告诉您该符号的使用位置。
编辑:修改后的问题
可以通过要求编译器将每个函数放入单独的部分中来解决此问题,以便它们在目标文件中保持分开,直到最终链接,然后指示链接器丢弃未引用的部分。
根据需要将-ffunction-sections
添加到CFLAGS
和/或CXXFLAGS
,以及-Wl,--gc-sections
到 LDFLAGS
。
链接时优化器 (-flto
) 也可以执行此操作,但据我所知需要启用优化,因此在调试版本中会失败。
关于c++ - 当未与 GCC 和 CMAKE 一起使用时如何解决 undefined reference ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44617703/