CMake / g ++,未在OpenFOAM应用程序中链接库

时间:2013-06-17 17:04:30

标签: c++ gcc dll linker cmake

我正在尝试编译自定义的OpenFOAM应用程序。我的构建过程是使用CMake(虽然我不确定这与我当前的问题有什么关系)。

对于那些熟悉OpenFOAM的人来说,这是pisoFoam应用程序,问题库是incompressibleLESModels.so库。

项目构建没有任何问题。并运行直到它需要使用IncompressibleLESModels库。此时,该应用程序声称不知道该库的任何信息并停止。

我在CMake脚本中的TARGET_LINK_LIBRARIES中包含了incompressibleLESModels库(以及所有其他必需的库)。

OpenFOAM允许用户通过输入文件在运行时链接到库中。这种方法工作正常(即,我可以让应用程序动态加载incompressibleLESModels lib并运行)。但我宁愿不依赖这种方法。标准的OpenFOAM应用程序不会这样做。

当我在我的可执行文件上运行ldd时,incompressibleLESModels库显然不在库列表中。

因此,就好像链接器在链接阶段检测到不需要库并选择不链接它。据我所知,这可能是由于传递给gcc的定义,特别是需要添加的,或者根据需要和不按需要。

我通过CMake中的ADD_DEFINITIONS命令添加以下定义:

-DWM_DP  -m64  -Dlinux64  -Wall -Wextra -Wno-unused-parameter -Wold-style-cast 
-Wnon-virtual-dtor -O3  -DNoRepository -ftemplate-depth-100 -fPIC -Xlinker 
--add-needed -Xlinker --no-as-needed

非常感谢任何想法。

亲切的问候,Madeleine

1 个答案:

答案 0 :(得分:0)

由于您使用的是cmake,因为链接指令而不是使用add_definitions,请使用target_link_libraries

target_link_libraries(<targetname> "-Wl,--no-as-needed")
target_link_libraries(<targetname> <libraries that you want to link even if apparently not necessary>)
target_link_libraries(<targetname> "-Wl,--add-needed")
target_link_libraries(<targetname> <libraries that you want to link according to the "default" criteria>)

参考:http://www.cmake.org/cmake/help/v2.8.11/cmake.html#command:target_link_libraries

此外,对于-fPIC等,建议您使用CMAKE_CXX_FLAGS之类的变量,并为其附加标记。

设置(CMAKE_CXX_FLAGS“$ {CMAKE_CXX_FLAGS} -fPIC”)

注意:使用list和append对此不起作用,因为通常列表元素用分号分隔。根据构建类型,您可以拥有标志,例如CMAKE_CXX_FLAGS_DEBUG和CMAKE_CXX_FLAGS_RELEASE。

http://www.cmake.org/cmake/help/v2.8.11/cmake.html#variable:CMAKE_LANG_FLAGS_DEBUG http://www.cmake.org/cmake/help/v2.8.11/cmake.html#variable:CMAKE_LANG_FLAGS_RELEASE