【问题标题】:CMake OS X CLion. How to link a custom dynamic library?CMake OS X CLion。如何链接自定义动态库?
【发布时间】:2017-11-24 16:47:03
【问题描述】:

这个问题可能被问了好几次了。但我找不到解决方案。我尝试链接共享库并将其添加到 RPATH。我尝试了几种解决方案:

这是我的 Cmake 文件:

cmake_minimum_required(VERSION 3.7)
project(Cpp)

set(CMAKE_CXX_STANDARD 11)

file(GLOB CPP_UTILS CppUtils/*.cpp CppUtils/*.h)
set(SOURCE_FILES main.cpp ${CPP_UTILS})
add_executable(Cpp ${SOURCE_FILES})

SET(CMAKE_INSTALL_RPATH_USE_LINK_PATH TRUE)

target_link_libraries(Cpp /Users/mac/Projects/ECMCalmnessScroreAlgo/Cpp/libs/libpython3.7m.dylib)

include_directories(Include)

它在运行时输出以下错误:

dyld: Library not loaded: /usr/local/lib/libpython3.7m.dylib
  Referenced from: /Users/mac/Projects/ECMCalmnessScroreAlgo/Cpp/cmake-build-debug/Cpp
  Reason: image not found

临时我只想链接一个自定义库,以了解它是如何工作的。然后我想在构建执行时复制 libs 文件夹。

这是我尝试手动运行命令时输出的内容 make VERBOSE=1

/Applications/CLion.app/Contents/bin/cmake/bin/cmake -H/Users/mac/Projects/ECMCalmnessScroreAlgo/Cpp -B/Users/mac/Projects/ECMCalmnessScroreAlgo/Cpp/cmake-build-debug --check-build-system CMakeFiles/Makefile.cmake 0
/Applications/CLion.app/Contents/bin/cmake/bin/cmake -E cmake_progress_start /Users/mac/Projects/ECMCalmnessScroreAlgo/Cpp/cmake-build-debug/CMakeFiles /Users/mac/Projects/ECMCalmnessScroreAlgo/Cpp/cmake-build-debug/CMakeFiles/progress.marks
/Applications/Xcode.app/Contents/Developer/usr/bin/make -f CMakeFiles/Makefile2 all
/Applications/Xcode.app/Contents/Developer/usr/bin/make -f CMakeFiles/Cpp.dir/build.make CMakeFiles/Cpp.dir/depend
cd /Users/mac/Projects/ECMCalmnessScroreAlgo/Cpp/cmake-build-debug && /Applications/CLion.app/Contents/bin/cmake/bin/cmake -E cmake_depends "Unix Makefiles" /Users/mac/Projects/ECMCalmnessScroreAlgo/Cpp /Users/mac/Projects/ECMCalmnessScroreAlgo/Cpp /Users/mac/Projects/ECMCalmnessScroreAlgo/Cpp/cmake-build-debug /Users/mac/Projects/ECMCalmnessScroreAlgo/Cpp/cmake-build-debug /Users/mac/Projects/ECMCalmnessScroreAlgo/Cpp/cmake-build-debug/CMakeFiles/Cpp.dir/DependInfo.cmake --color=
/Applications/Xcode.app/Contents/Developer/usr/bin/make -f CMakeFiles/Cpp.dir/build.make CMakeFiles/Cpp.dir/build
make[2]: Nothing to be done for `CMakeFiles/Cpp.dir/build'.
[100%] Built target Cpp
/Applications/CLion.app/Contents/bin/cmake/bin/cmake -E cmake_progress_start /Users/mac/Projects/ECMCalmnessScroreAlgo/Cpp/cmake-build-debug/CMakeFiles 0
yo:cmake-build-debug stikhonenko$ make clean
yo:cmake-build-debug stikhonenko$ make VERBOSE=1
/Applications/CLion.app/Contents/bin/cmake/bin/cmake -H/Users/mac/Projects/ECMCalmnessScroreAlgo/Cpp -B/Users/mac/Projects/ECMCalmnessScroreAlgo/Cpp/cmake-build-debug --check-build-system CMakeFiles/Makefile.cmake 0
/Applications/CLion.app/Contents/bin/cmake/bin/cmake -E cmake_progress_start /Users/mac/Projects/ECMCalmnessScroreAlgo/Cpp/cmake-build-debug/CMakeFiles /Users/mac/Projects/ECMCalmnessScroreAlgo/Cpp/cmake-build-debug/CMakeFiles/progress.marks
/Applications/Xcode.app/Contents/Developer/usr/bin/make -f CMakeFiles/Makefile2 all
/Applications/Xcode.app/Contents/Developer/usr/bin/make -f CMakeFiles/Cpp.dir/build.make CMakeFiles/Cpp.dir/depend
cd /Users/mac/Projects/ECMCalmnessScroreAlgo/Cpp/cmake-build-debug && /Applications/CLion.app/Contents/bin/cmake/bin/cmake -E cmake_depends "Unix Makefiles" /Users/mac/Projects/ECMCalmnessScroreAlgo/Cpp /Users/mac/Projects/ECMCalmnessScroreAlgo/Cpp /Users/mac/Projects/ECMCalmnessScroreAlgo/Cpp/cmake-build-debug /Users/mac/Projects/ECMCalmnessScroreAlgo/Cpp/cmake-build-debug /Users/mac/Projects/ECMCalmnessScroreAlgo/Cpp/cmake-build-debug/CMakeFiles/Cpp.dir/DependInfo.cmake --color=
/Applications/Xcode.app/Contents/Developer/usr/bin/make -f CMakeFiles/Cpp.dir/build.make CMakeFiles/Cpp.dir/build
[ 25%] Building CXX object CMakeFiles/Cpp.dir/main.cpp.o
/Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/c++    -I/Users/mac/Projects/ECMCalmnessScroreAlgo/Cpp/Include  -g -isysroot /Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX10.13.sdk   -std=gnu++11 -o CMakeFiles/Cpp.dir/main.cpp.o -c /Users/mac/Projects/ECMCalmnessScroreAlgo/Cpp/main.cpp
[ 50%] Building CXX object CMakeFiles/Cpp.dir/CppUtils/System.cpp.o
/Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/c++    -I/Users/mac/Projects/ECMCalmnessScroreAlgo/Cpp/Include  -g -isysroot /Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX10.13.sdk   -std=gnu++11 -o CMakeFiles/Cpp.dir/CppUtils/System.cpp.o -c /Users/mac/Projects/ECMCalmnessScroreAlgo/Cpp/CppUtils/System.cpp
[ 75%] Building CXX object CMakeFiles/Cpp.dir/CppUtils/TimeUtils.cpp.o
/Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/c++    -I/Users/mac/Projects/ECMCalmnessScroreAlgo/Cpp/Include  -g -isysroot /Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX10.13.sdk   -std=gnu++11 -o CMakeFiles/Cpp.dir/CppUtils/TimeUtils.cpp.o -c /Users/mac/Projects/ECMCalmnessScroreAlgo/Cpp/CppUtils/TimeUtils.cpp
[100%] Linking CXX executable Cpp
/Applications/CLion.app/Contents/bin/cmake/bin/cmake -E cmake_link_script CMakeFiles/Cpp.dir/link.txt --verbose=1
/Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/c++   -g -isysroot /Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX10.13.sdk -Wl,-search_paths_first -Wl,-headerpad_max_install_names  CMakeFiles/Cpp.dir/main.cpp.o CMakeFiles/Cpp.dir/CppUtils/System.cpp.o CMakeFiles/Cpp.dir/CppUtils/TimeUtils.cpp.o  -o Cpp ../libs/libpython3.7m.dylib 
[100%] Built target Cpp
/Applications/CLion.app/Contents/bin/cmake/bin/cmake -E cmake_progress_start /Users/mac/Projects/ECMCalmnessScroreAlgo/Cpp/cmake-build-debug/CMakeFiles 0

【问题讨论】:

  • CLion 为我做这件事。这是我在控制台/Applications/CLion.app/Contents/bin/cmake/bin/cmake --build /Users/mac/Projects/ECMCalmnessScroreAlgo/Cpp/cmake-build-debug --target Cpp 中看到的命令—— j 4
  • /Users/mac/Projects/ECMCalmnessScroreAlgo/Cpp/libs/libpython3.7m.dylib 实际上是指向/usr/local/lib/libpython3.7m.dylib 的符号链接吗?运行可执行文件时是否存在原始文件? @keith:这里没有什么可以安装的。
  • 这是原始文件。并且存在于源码目录中
  • 嗯,那为什么错误信息告诉我们不同的文件...
  • /usr/local/lib/libpython3.7m.dylib 文件是否存在?没有

标签: c++ macos cmake


【解决方案1】:

您首先需要告诉 cmake 在哪里找到库 (find_library),然后才能在 target_link_libraries 中使用来自 find_library 的结果

find_library 接受 PATHS 参数,您可以使用该参数告诉 cmake 去哪里查看

find_library(
    PYTHON_3 
    libpython3.7m 
    PATHS
        /Users/mac/Projects/ECMCalmnessScroreAlgo/Cpp/libs)

现在您将拥有一个变量${PYTHON_3},其中包含库的路径。你在target_link_libraries中使用那个变量

target_link_libraries(
    Cpp
    ${PYTHON_3})

这是完整的CMakeLists.txt

cmake_minimum_required(VERSION 3.7)
project(Cpp)

set(CMAKE_CXX_STANDARD 11)

file(GLOB CPP_UTILS CppUtils/*.cpp CppUtils/*.h)
set(SOURCE_FILES main.cpp ${CPP_UTILS})
add_executable(Cpp ${SOURCE_FILES})

SET(CMAKE_INSTALL_RPATH_USE_LINK_PATH TRUE)

find_library(
    PYTHON_3 
    libpython3.7m 
    PATHS
        /Users/mac/Projects/ECMCalmnessScroreAlgo/Cpp/libs)

target_link_libraries(Cpp ${PYTHON_3})
target_include_directories(Cpp Include)

【讨论】:

  • 它输出:CMake 错误:此项目中使用了以下变量,但它们设置为 NOTFOUND。请设置它们或确保它们在 CMake 文件中正确设置和测试:PYTHON_3 由目录 /Users/mac/Projects/ECMCalmnessScroreAlgo/Cpp 中的目标“Cpp”链接
  • 所以 cmake 告诉你它在位置 /Users/mac/Projects/ECMCalmnessScroreAlgo/Cpp/libs 中找不到 libpython3.7m。您确定那里有可用的库吗?
  • 我将 libpython3.7m 更改为 libpython3.7m.dylib。现在它输出与以前相同的错误: dyld: Library not loaded: /usr/local/lib/libpython3.7m.dylib Referenced from: /Users/mac/Projects/ECMCalmnessScroreAlgo/Cpp/cmake-build-debug/Cpp Reason : 图片未找到
  • 你试过静态链接吗?尝试在调用find_library之前添加set(CMAKE_FIND_LIBRARY_SUFFIXES ${CMAKE_STATIC_LIBRARY_SUFFIX})
  • 请在尝试构建时发布make VERBOSE=1 的输出
【解决方案2】:

让我们尝试链接库的目录!

假设你的库名称是libpython3

cmake_minimum_required(VERSION 3.7)
project(Cpp)

set(CMAKE_CXX_STANDARD 11)



file(GLOB CPP_UTILS CppUtils/*.cpp CppUtils/*.h)
set(SOURCE_FILES main.cpp ${CPP_UTILS})
add_executable(Cpp ${SOURCE_FILES})

SET(CMAKE_INSTALL_RPATH_USE_LINK_PATH TRUE)


LINK_DIRECTORIES(/Users/mac/Projects/ECMCalmnessScroreAlgo/Cpp/libs)

target_link_libraries(Cpp libpython3.7m)

include_directories(Include)

这行得通吗? :-)

【讨论】:

  • 不,编译时失败:ld:找不到 -llibpython3.7m 的库。我之前尝试过这个解决方案。
  • 哦,有趣!我想知道史蒂夫的答案是否在这里有效?一个我们俩学习的机会!
猜你喜欢
  • 1970-01-01
  • 2020-06-17
  • 1970-01-01
  • 2022-01-04
  • 2018-08-18
  • 1970-01-01
  • 1970-01-01
  • 2019-09-05
  • 1970-01-01
相关资源
最近更新 更多