【发布时间】:2017-11-20 21:51:33
【问题描述】:
我正在尝试在 CMAKE 的帮助下将一些 MSVC 项目移植到 Linux。 在其中一个库项目中,有一些函数只是声明了,没有在任何地方定义或在任何地方使用。 例如:
int fun_a();
int fun_unsed() /*This function is never used in project*/
{
fun_a();
}
现在,当我尝试在 Linux 中进行 make 时,我观察到对已声明函数的未定义引用。但是相同的代码适用于具有相同 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)
【问题讨论】:
-
显示精确的
CMakeLists.txt。关于设置 CMAKE_CXX_FLAGS 有一些具体规定。此外,运行构建过程make V=1,使用该选项您可能会看到用于编译和链接的完整命令行。 -
@Tsyvarev 添加了 CMakeLists.txt 文件,make V=1 不提供任何额外信息
-
对不起,我的意思是
make VERBOSE=1。你的CMakeLists.txt的内容看起来很合理,除了: 1. 你设置了 GCC_COVERAGE_LINK_FLAGS 变量 twice,所以第二个赋值会覆盖第一个。 2. 在第一个赋值中,它应该在值的开头附加破折号:--unresolved-symbols=...。