我目前在以下设置中遇到问题:

我的主要项目有一个子目录即库。该库取决于系统库“ triangle”(从源安装)。主项目确实使用子目录中的文件。
主项目(和库)的cmake正常运行。

建立库工作正常。
(在它自己的目录中,或者在主目录中使用
使subdir_lib编译没有问题)

这是问题开始的地方。
使用make项目构建主项目失败。发生在链接期间:

subdir/libsubdir_lib.a(Test.cpp.o): In function `Test::run()':
/home/mimre/workspace/tmp/cmake-problem/subdir/files/Test.cpp:34: undefined reference to `triangle_context_create'
/home/mimre/workspace/tmp/cmake-problem/subdir/files/Test.cpp:35: undefined reference to `triangle_context_options'
/home/mimre/workspace/tmp/cmake-problem/subdir/files/Test.cpp:42: undefined reference to `triangle_mesh_create'
/home/mimre/workspace/tmp/cmake-problem/subdir/files/Test.cpp:50: undefined reference to `triangle_context_destroy'
collect2: error: ld returned 1 exit status
CMakeFiles/cmake_problem.dir/build.make:95: recipe for target 'cmake_problem' failed
make[3]: *** [cmake_problem] Error 1
CMakeFiles/Makefile2:67: recipe for target 'CMakeFiles/cmake_problem.dir/all' failed
make[2]: *** [CMakeFiles/cmake_problem.dir/all] Error 2
CMakeFiles/Makefile2:79: recipe for target 'CMakeFiles/cmake_problem.dir/rule' failed
make[1]: *** [CMakeFiles/cmake_problem.dir/rule] Error 2
Makefile:118: recipe for target 'cmake_problem' failed
make: *** [cmake_problem] Error 2


为了避免在这里有很多代码,我将一个最小的示例上传到github:https://github.com/mimre25/cmake_problem

另外,这是我正在使用的库,与cmake和sudo make install一起安装:https://github.com/wo80/Triangle

我已经尝试过各种类似线程的解决方案,但是都没有用。

在此先感谢您的帮助!

最佳答案

我会以评论的形式写出来,但是我对此没有足够的声誉。这是您需要使用此Triangle(https://github.com/wo80/Triangle)而不是原始Triangle(https://www.cs.cmu.edu/~quake/triangle.html)的情况吗?如果可以使用后者,我从经验中知道它很容易链接。我只是使用此CMakeLists.txt将其放在代码的子目录中。

## This only works for linux. Use an if statement to handle all architectures.
SET(CMAKE_C_FLAGS
  "${CMAKE_C_FLAGS} -O -DLINUX -DTRILIBRARY -w -DANSI_DECLARATORS"
  )

SET(FILES_SOURCE
  triangle.h triangle.c
  )

ADD_LIBRARY( my_local_name_for_triangle_library STATIC ${FILES_SOURCE} )


然后,我可以链接到这样创建的三角形库:

include_directories(my_local_triangle_dir)
target_link_libraries(my_local_name_for_triangle_library)


但是,某些#define宏在triangle.h中丢失,因此您需要将它们从triangle.c复制到triangle.h。

关于c++ - Make/Cmake子目录链接到外部库失败,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/48669411/

10-11 21:25