2017-06-18 103 views
0

我想借助CMAKE将一些MSVC项目移植到Linux。 在其中一个库项目中,有一些函数只是声明的,并没有在任何地方定义或在任何地方使用。 为前:如何解决未定义的引用时,他们不使用GCC和CMAKE

int fun_a(); 
    int fun_unsed() /*This function is never used in project*/ 
    { 
     fun_a(); 
    } 

现在,当我尝试做制作在Linux中,我观察未定义参考声明的函数。但是相同的代码在MSVC上使用相同的CMAKE文件。

我试图在我的CMAKE文件中使用下面的标志(来自here),但似乎没有帮助。

SET(GCC_COVERAGE_COMPILE_FLAGS “-unresolved符号=忽略所有”) SET(GCC_COVERAGE_LINK_FLAGS “-unresolved符号=忽略所有”)

SET(CMAKE_CXX_FLAGS “$ {CMAKE_CXX_FLAGS} $ {GCC_COVERAGE_COMPILE_FLAGS}” ) SET(CMAKE_EXE_LINKER_FLAGS“$ {CMAKE_EXE_LINKER_FLAGS} $ {GCC_COVERAGE_LINK_FLAGS}”)

我错过了什么?

下面是可执行

#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) 
+0

显示精确的'CMakeLists.txt'。有一些关于设置* CMAKE_CXX_FLAGS *的具体内容。另外,运行构建过程'make V = 1',使用该选项,您可以看到用于编译和链接的完整命令行。 – Tsyvarev

+1

@Tsyvarev添加了CMakeLists.txt文件,使V = 1不提供任何额外的信息 – Rama

+0

对不起,我的意思是'使VERBOSE = 1'。你的'CMakeLists.txt'的内容看起来很合理,除了:1.你设置了* GCC_COVERAGE_LINK_FLAGS *变量**两次**,所以第二个任务将覆盖第一个。 2.在第一次赋值时,它应该是值的开始处的附加短划线:'--unresolved-symbols = ...'。 – Tsyvarev

回答

2

cmake的文件如果他们确实是未引用的,你不会得到一个“未定义的引用”错误。

链接器错误应该告诉你符号在哪里使用。

编辑:修订后的问题

这可以围绕通过要求编译器将每个函数到单独的部分进行加工,所以他们保持分开的目标文件中,直到最后一个环节,然后指示链接器丢弃未被引用的部分。

-ffunction-sections加到CFLAGS和/或CXXFLAGS-Wl,--gc-sectionsLDFLAGS

链接时间优化程序(-flto)也可以这样做,但AFAIK需要优化才能启用,所以它在调试版本中会失败。

+0

我想我没有正确提问,我纠正了它。该函数被引用,但不使用调用函数。 – Rama

+0

尝试提到编译器,链接器的标志。但我仍然看到错误。即使-flto也似乎不起作用。 – Rama

0

如果您的项目中没有该功能的实现,那么它必须在另一个库中实现。在Visual Studio项目中,右键单击项目,选择“属性”,然后在“链接器”下查看链接库和链接目录。你会在那里看到至少一个库。然后在CMAKE中,您只需要target_link_libraries即可。

相关问题