如何指定target_link_libraries

时间:2019-11-15 19:34:04

标签: cmake linker libcurl ld

我有一些具有cmake构建系统的代码库。在构建iam时出现如下错误

/usr/bin/ld: cannot find -lcurl

下面是示例cmakelist.txt

cmake_minimum_required(VERSION 2.8.6)
project(oci_object_test)

set(IB_HOME /home/user/sample_cmake/usr/lib)

include_directories(${LIB_HOME}/include)
link_directories(${LIB_HOME}/lib64)

link_directories(/home/user/sample_cmake/usr/lib/lib64)
link_directories(/home/user/)

set(SOURCES
        sample.cpp
)

add_executable(demo ${SOURCES})
target_link_libraries(demo curl openssl) 

以下cmakelist.txt的上方是cmake生成的link.txt

/usr/bin/c++      CMakeFiles/demo.dir/sample.cpp.o  -o demo  -L/home/user/sample_cmake/usr/lib/lib64  -L/home/user -rdynamic -lcurl -lopenssl -Wl,-rpath,/home/user/sample_cmake/usr/lib/lib64:/home/user 

此问题是由于-lcurl被添加到cmake生成的link.txt中。如果我从-lcurl中手动删除link.txt并进行构建,则build将成功而不会出现链接器错误。因此,有什么方法可以摆脱-lcurl中的这个link.txt,还是可以定义实际存在libcurl的-lcurl路径(例如,假设/usr/curl_path/curl中存在libcurl)该cmake可以生成如下的link.txt?

/usr/bin/c++      CMakeFiles/demo.dir/sample.cpp.o  -o demo  -L/home/user/sample_cmake/usr/lib/lib64  -L/home/user -rdynamic /usr/curl_path/curl -lopenssl -Wl,-rpath,/home/user/sample_cmake/usr/lib/lib64:/home/user 

我知道我可以按照以下方式直接定义libucrl路径,这将解决我的问题,

target_link_libraries(demo /usr/curl_path/curl openssl) 

但是我正在寻找类似SET或其他任何cmake environment variable的东西,我可以在toolchain.cmake文件中定义它们,以使cmakelist.txt不受影响,in simple words how do i specify those libraries's path to cmake which are going use inside target_link_libraries

2 个答案:

答案 0 :(得分:0)

如果您的CMake版本低于3.12,则需要使用此旧方法。看到: https://cmake.org/cmake/help/v3.10/module/FindCURL.html

cmake_minimum_required(VERSION 3.10)
project(program)

find_package(CURL REQUIRED)

if (CURL_FOUND)
    add_executable(program main.cpp)
    target_link_libraries(program ${CURL_LIBRARIES})
    target_include_directories(program PRIVATE ${CURL_INCLUDE_DIRS})
endif()

对于CMake 3.12和更高版本,有一种使用导入目标的新方法。请参阅新的替代方法FindCurl

cmake_minimum_required(VERSION 3.12)
project(program)

find_package(CURL REQUIRED)

if (CURL_FOUND)
    add_executable(program main.cpp)
    target_link_libraries(program CURL::libcurl)
endif()

答案 1 :(得分:0)

我发现可以通过两种方法解决此问题(第一种方法类似于this

第二种方法是在调用cmakelist.txt之前在您的target_link_directories文件中添加以下两行代码

add_library( curl SHARED IMPORTED)
set_property(TARGET curl PROPERTY IMPORTED_LOCATION "${CURL_LIBRARY}")

其中CURL_LIBRARYlibcurl.so中指定的toolchain.cmake的路径 不幸的是,如果不触摸cmakelist.txt,我找不到任何解决此问题的解决方案。