1、CMake引入第三方库
find_package(PkgConfig REQUIRED)
pkg_search_module(alibabacloud-oss-cpp-sdk IMPORTED_TARGET alibabacloud-oss-cpp-sdk)
message(STATUS "AliOSS include path: ${alibabacloud-oss-cpp-sdk_INCLUDE_DIRS}")
message(STATUS "AliOSS library path: ${alibabacloud-oss-cpp-sdk_LIBRARY_DIRS}")
message(STATUS "AliOSS library: ${alibabacloud-oss-cpp-sdk_LIBRARIES}")
target_link_libraries(${SOURCE} ... PkgConfig::alibabacloud-oss-cpp-sdk)
在CmakeLists中使用pkg-config引入三方库,需要先使用pkg_search_module或者pkg_check_modules在当前文件内引入对应的库,然后使用PkgConfig::xxx将第三方库链接到对应的可执行文件中,其中xxx必须与pkg_search_module第一个参数一致
2、Ubuntu中使用sudo执行脚本失败,而不使用sudo则正常
很大概率是因为sudo使用了dash作为执行脚本的方式,可以使用下面命令查询
sudo ls -l /bin/sh
如果是dash,则使用下面命令修改为bash
sudo ln -sf /bin/bash /bin/sh
3、编译报错-lSTATIC
cmake项目编译报错,通过查看build.ninja发现链接信息中多了个-lSTATIC
build sample/cpp-sdk-sample: CXX_EXECUTABLE_LINKER__cpp-sdk-sample_Release sample/CMakeFiles/cpp-sdk-sample.dir/src/Config.cc.o sample/CMakeFiles/cpp-sdk-sample.dir/src/Program.cc.o sample/CMakeFiles/cpp-sdk-sample.dir/src/service/ServiceSample.cc.o sample/CMakeFiles/cpp-sdk-sample.dir/src/bucket/BucketSample.cc.o sample/CMakeFiles/cpp-sdk-sample.dir/src/object/ObjectSample.cc.o sample/CMakeFiles/cpp-sdk-sample.dir/src/presignedurl/PresignedUrlSample.cc.o sample/CMakeFiles/cpp-sdk-sample.dir/src/LiveChannel/LiveChannelSample.cc.o sample/CMakeFiles/cpp-sdk-sample.dir/src/encryption/EncryptionSample.cc.o | lib/libalibabacloud-oss-cpp-sdk.a /usr/lib/x86_64-linux-gnu/libssl.so /usr/lib/x86_64-linux-gnu/libcrypto.so /usr/lib/x86_64-linux-gnu/libcurl.so /home/lai/videoclip/build-linuxRelease/lib/libtinyxml2.so || lib/libalibabacloud-oss-cpp-sdk.a
FLAGS = -DNDEBUG -O3 -DNDEBUG
LINK_FLAGS = -rdynamic
LINK_LIBRARIES = -Wl,-rpath,/home/lai/videoclip/build-linuxRelease/lib: lib/libalibabacloud-oss-cpp-sdk.a -lpthread -lSTATIC -lssl -lcrypto -lcurl /home/lai/videoclip/build-linuxRelease/lib/libtinyxml2.so
OBJECT_DIR = sample/CMakeFiles/cpp-sdk-sample.dir
POST_BUILD = :
PRE_LINK = :
TARGET_COMPILE_PDB = sample/CMakeFiles/cpp-sdk-sample.dir/
TARGET_FILE = sample/cpp-sdk-sample
TARGET_PDB = sample/cpp-sdk-sample.pdb
查看对应位置的CMakeLists.txt发现在target_link_libraries中错误使用了STATIC
target_link_libraries(${PROJECT_NAME}${STATIC_LIB_SUFFIX} STATIC
PkgConfig::ssl
PkgConfig::crypto
PkgConfig::curl
PkgConfig::tinyxml2
)
第二个参数的关键字只支持 PUBLIC,PRIVATE 或 INTERFACE;所以会将STATIC错误识别为一个库。
解决方案:
去掉STATIC,如果要在pkgconfig中设置编译静态库,则在find_package(PkgConfigREQUIRED)前面加上set(ENV{PKG_CONFIG_ALL_STATIC} 1)