Cmake 如何正确地将路径添加到libfiles?
我的项目在Cmake 如何正确地将路径添加到libfiles?,cmake,Cmake,我的项目在~/SimGrid/lib目录中有一个依赖项库。 如何将其正确添加到我的CMakeLists.txt 现在我尝试链接目录(/home/whoami/SimGrid/lib),但它没有帮助,并提供: [ 5%] Linking CXX executable CSim2Sim /usr/bin/ld: cannot find -lsimgrid collect2: error: ld returned 1 exit status 我的完整CMakeLists.txt如下: projec
~/SimGrid/lib
目录中有一个依赖项库。
如何将其正确添加到我的CMakeLists.txt
现在我尝试链接目录(/home/whoami/SimGrid/lib)
,但它没有帮助,并提供:
[ 5%] Linking CXX executable CSim2Sim
/usr/bin/ld: cannot find -lsimgrid
collect2: error: ld returned 1 exit status
我的完整CMakeLists.txt
如下:
project(CSim2Sim)
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -std=c++11 -g -O0")
set(SOURCE_FILES src/main.cpp)
add_executable(CSim2Sim ${SOURCE_FILES})
include_directories(/home/whoami/SimGrid/include)
link_directories(/home/whoami/SimGrid/lib)
target_link_libraries(CSim2Sim simgrid)
link\u目录
只告诉CMake在哪些目录中查找要链接的库,而不是要链接的库。我的建议是创建一个名为SimGrid.cmake
的文件,并添加以下内容:
# -*- cmake -*-
set(SIMGRID_INCLUDE_DIRS
${CMAKE_SOURCE_DIR}/SimGrid/include
)
set(SIMGRID_LIBRARIES
simgrid.a
simgrid2.a # etc for the names of the actual libs you want to link
)
在CMakeLists.txt
addinclude(SimGrid)
中拉入新文件
然后在CmakeLists.txt
中,使用新变量和target_link_libraries
函数告诉链接器要链接哪些库:
include_directories(${SIMGRID_INCLUDE_DIRS})
target_link_libraries(CSim2Sim ${SIMGRID_LIBRARIES})
当然,您可以将其全部添加到您的单个CMakeLists.txt
,但将其分割是保持事情可管理性的良好实践
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -std=c++11 -g -O0")
set(SOURCE_FILES src/main.cpp)
add_executable(CSim2Sim ${SOURCE_FILES})
link_directories(${CMAKE_SOURCE_DIR}/SimGrid/lib)
include_directories(${CMAKE_SOURCE_DIR}/SimGrid/include)
set(SIMGRID_LIBRARIES
simgrid.a
simgrid2.a
)
target_link_libraries(CSim2Sim ${SIMGRID_LIBRARIES})
在Linux上,链接器希望库文件名的前缀为“lib”: 如果库文件没有此类前缀,则链接器无法使用普通库名称找到它 与此相反,在
target\u link\u libraries
调用中指定完整库文件名始终有效:
# Assume filename of the library is 'simgrid.so'
target_link_libraries(CSim2Sim /home/whoami/SimGrid/lib/simgrid.so)
在这种情况下,不需要调用
link\u directories()
。我的建议是找到项目所依赖的库并将其链接到目标。因此,任何绝对路径或相对路径都不在cmake文件中,而是在运行cmake时检测到的
请参见我已将您的建议添加到
CMakeLists.txt
,但我有相同的错误。可能是因为我有。因此
文件,而不是。a
文件?@CinderBiscuits:使用相对路径(如simgrid.a
)到库是未定义的行为。相反,原始core使用简单的库名(simgrid
),它具有定义良好的行为。除了其他错误(您的SimGrid.cmake
missesinclude\u目录
call)之外,您的方法还有一点意义。如果您建议使用附加脚本进行库检测,则它应该是FindSimGrid.cmake
脚本,包含在find\u包(SimGrid)
中。请参阅
# Assume filename of the library is 'simgrid.so'
target_link_libraries(CSim2Sim /home/whoami/SimGrid/lib/simgrid.so)