c++ - 当未与 GCC 和 CMAKE 一起使用时如何解决 undefined reference

标签 c++ linux gcc cmake

我正在尝试在 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/

相关文章:

c++ - 在另一个静态库中包含(链接)静态库时出现问题

c++ - 为什么使用 std::transform 会导致 exc_bad_access

c++ - 如何在另一个项目的dll中添加调用函数

linux - 从路径的子目录读取文件并将它们附加到一个文件

linux - 在 Linux 上安装 TIbco ems 8.1

c - 为什么 GCC 没有将这个 'printf' 优化为 'puts' ?

c++ - 编译多个文件的问题

C++ 菜鸟(流)...如何从字符串有空格的文件中读取字符串(例如,Tom Smith)?使用 getline 而不是 >> 时遇到问题

linux - SVN checkout 失败,提示 URL 格式错误

C++ 链接库的标志在哪里记录?