个人编译踩的坑

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)

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值