我如何指定 target_link_libraries 使用的库的 cmake 路径
how do i specify libraries's path to cmake which are used by target_link_libraries
我有一些具有 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
中。如果我手动从 link.txt
中删除 -lcurl
并构建,构建将成功且没有链接器错误。那么有什么办法可以在 link.txt
中摆脱这个 -lcurl
或者是否可以在实际存在 libcurl 的地方定义 -lcurl 路径(例如假设 libcurl 存在于 /usr/curl_path/curl
中)所以该 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
或我可以在 toolchain.cmake 文件中定义的任何其他 cmake environment variable
的东西,以便 cmakelist.txt
保持不变,in simple words how do i specify those libraries's path to cmake which are going use inside target_link_libraries
如果你的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()
我发现这个问题可以通过两种方法解决(第一种方法类似于)
第二种方法是在调用 target_link_directories
之前将以下两行代码添加到您的 cmakelist.txt
文件中
add_library( curl SHARED IMPORTED)
set_property(TARGET curl PROPERTY IMPORTED_LOCATION "${CURL_LIBRARY}")
其中 CURL_LIBRARY
是 toolchain.cmake
中指定的 libcurl.so
的路径
不幸的是,我没有找到任何解决方案来解决这个问题而不触及 cmakelist.txt
。
我有一些具有 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
中。如果我手动从 link.txt
中删除 -lcurl
并构建,构建将成功且没有链接器错误。那么有什么办法可以在 link.txt
中摆脱这个 -lcurl
或者是否可以在实际存在 libcurl 的地方定义 -lcurl 路径(例如假设 libcurl 存在于 /usr/curl_path/curl
中)所以该 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
或我可以在 toolchain.cmake 文件中定义的任何其他 cmake environment variable
的东西,以便 cmakelist.txt
保持不变,in simple words how do i specify those libraries's path to cmake which are going use inside target_link_libraries
如果你的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()
我发现这个问题可以通过两种方法解决(第一种方法类似于
第二种方法是在调用 target_link_directories
cmakelist.txt
文件中
add_library( curl SHARED IMPORTED)
set_property(TARGET curl PROPERTY IMPORTED_LOCATION "${CURL_LIBRARY}")
其中 CURL_LIBRARY
是 toolchain.cmake
中指定的 libcurl.so
的路径
不幸的是,我没有找到任何解决方案来解决这个问题而不触及 cmakelist.txt
。