macOS下Conan+CMake构建ScreenCaptureLite报x86_64未定义符号问题
问题解答
方案优先级说明
优先选择修改Conan recipe配置,这符合包管理的设计原则:库本身的依赖、链接规则应该由包recipe统一维护,所有消费这个包的项目不需要额外重复配置,可避免重复出错。
修改Conan recipe的具体操作
你需要修改conanfile.py的package_info方法,根据不同操作系统添加对应的系统依赖、框架配置,同时修正你原来写错的库名:
from conans import ConanFile, CMake, tools class ScreenCapLiteConan(ConanFile): name = "ScreenCaptureLite" version = "11.0.0" license = "MIT" author = "smasherprog@gmail.com" url = "https://github.com/smasherprog/screen_capture_lite/" description = "Capture screen grabs in C++" topics = ("screengrab", "capture") settings = "os", "compiler", "build_type", "arch" options = {"shared": [True, False]} default_options = {"shared": False} generators = "cmake" def source(self): # 建议将SSH地址替换为HTTPS地址,避免无SSH密钥的环境拉取失败 self.run("git clone --depth 1 --branch v11.0.0 https://github.com/smasherprog/screen_capture_lite.git") def build(self): cmake = CMake(self) cmake.configure(source_folder="screen_capture_lite") cmake.build() def package(self): self.copy("*.h", dst="include", src="screen_capture_lite/include", keep_path=False) # 删掉模板残留的hello.lib拷贝逻辑 self.copy("*.dll", dst="bin", keep_path=False) self.copy("*.so", dst="lib", keep_path=False) self.copy("*.dylib", dst="lib", keep_path=False) self.copy("*.a", dst="lib", keep_path=False) def package_info(self): # 修正库名,和实际编译产出的libscreen_capture.a对应 self.cpp_info.libs = ["screen_capture"] if self.settings.os == "Windows": self.cpp_info.system_libs = ["Dwmapi"] self.cpp_info.defines.append("NOMINMAX") elif self.settings.os == "Macos": self.cpp_info.frameworks = [ "CoreFoundation", "Cocoa", "CoreMedia", "AVFoundation", "CoreGraphics", "CoreVideo" ] self.cpp_info.system_libs = ["pthread"] elif self.settings.os == "Linux": self.cpp_info.system_libs = [ "X11", "Xfixes", "Xtst", "Xinerama", "pthread" ]
修改完成后重新打包上传到私有registry,原有消费项目不需要调整任何代码即可正常完成链接。
临时方案:修改消费项目CMakeLists.txt
如果你暂时不想更新Conan包,也可以把官方的平台依赖配置加到你自己项目的CMakeLists.txt里,在链接时追加平台依赖库即可:
cmake_minimum_required(VERSION 2.8.12) project(scl_app_server) add_compile_options(-std=c++17) # Using the "cmake" generator include(${CMAKE_BINARY_DIR}/conanbuildinfo.cmake) conan_basic_setup(TARGETS) # 新增平台依赖配置 if(WIN32) set(PLATFORM_LIBS Dwmapi) add_definitions(-DNOMINMAX) elseif(APPLE) find_package(Threads REQUIRED) find_library(corefoundation_lib CoreFoundation REQUIRED) find_library(cocoa_lib Cocoa REQUIRED) find_library(coremedia_lib CoreMedia REQUIRED) find_library(avfoundation_lib AVFoundation REQUIRED) find_library(coregraphics_lib CoreGraphics REQUIRED) find_library(corevideo_lib CoreVideo REQUIRED) set(PLATFORM_LIBS ${CMAKE_THREAD_LIBS_INIT} ${corefoundation_lib} ${cocoa_lib} ${coremedia_lib} ${avfoundation_lib} ${coregraphics_lib} ${corevideo_lib} ) else() find_package(X11 REQUIRED) if(!X11_XTest_FOUND) message(FATAL_ERROR "X11 extensions are required, but not found!") endif() if(!X11_Xfixes_LIB) message(FATAL_ERROR "X11 fixes extension is required, but not found!") endif() find_package(Threads REQUIRED) set(PLATFORM_LIBS ${X11_LIBRARIES} ${X11_Xfixes_LIB} ${X11_XTest_LIB} ${X11_Xinerama_LIB} ${CMAKE_THREAD_LIBS_INIT} ) endif() FILE ( GLOB SCL_APP_SRC src/*.cpp ) add_executable(scl_app_server ${SCL_APP_SRC} ) # 新增PLATFORM_LIBS链接参数 target_link_libraries(scl_app_server CONAN_PKG::ScreenCaptureLite ${PLATFORM_LIBS})
该方案的缺点是所有依赖ScreenCaptureLite包的项目都要重复添加这段配置,维护成本高,仅适合临时测试使用。
内容的提问来源于stack exchange,提问作者Erik
相关产品推荐
相关产品推荐

