相关疑难解决方法(0)

将静态库链接到其他静态库

我有一小段代码依赖于许多静态库(a_1-a_n).我想将该代码打包到静态库中,并将其提供给其他人.

我的静态库,让我们称之为X,编译好.

我创建了一个使用X函数的简单示例程序,但是当我尝试将它链接到X时,我从库a_1 - a_n中得到许多关于丢失符号的错误.

有没有办法可以创建一个新的静态库,Y包含X和X所需的所有功能(a_1 - a_n中的选定位),这样我就可以为人们分配Y来链接他们的程序了吗?


更新:

我已经看过只是使用ar转储所有内容并制作一个mega-lib,然而,最终包含了许多不需要的符号(所有.o文件大约为700 MB,但是,静态链接的可执行文件是7 MB).有没有一种很好的方法只包括实际需要的东西?


这看起来与如何将多个C/C++库合并为一个密切相关.

c++ linker unix-ar .a

125
推荐指数
6
解决办法
10万
查看次数

CMake:将库链接到库

我有cmake的问题.我有,比方说,CMakeLists1有一个CMakeLists2所在的子目录.

在CMakeLists2中,我的目标是一个静态库.我想将它链接到外部库.我就这样做了:

link_directories ("path_to_library")
add_library (project2 ${sources})
target_link_libraries (project2 "name_of_external_lib")
Run Code Online (Sandbox Code Playgroud)

然后,我想在我的project1中使用这个project2中的一个类.我是这样做的:

add_executable (project1 ${sources})
target_link_libraries (project1 project2)
Run Code Online (Sandbox Code Playgroud)

但这根本不起作用.首先,project2没有链接到外部库.只是为了检查,我通过vs10项目属性添加了这个库,并且大小不同.第二件事,不知何故,project1看到了外部库(它在这个项目的库依赖项中),当然找不到它.

问题是什么?

cmake

18
推荐指数
1
解决办法
3万
查看次数

如何设置CMAKE_AR的选项

我用cmake进行交叉编译,一切正常,但是CMAKE_AR选项.

set(CMAKE_AR ${GCC_PATH}/dld)用来设置CMAKE_AR.但我不知道如何设置它的选择.默认情况下,它使用选项rc创建存档.但我需要改变它-X -r5 -o.当使用rc时,它会投诉文件rc无法找到.

怎么解决?

cmake

16
推荐指数
1
解决办法
1万
查看次数

CMake-在静态库中包括依赖项

我对C ++和所有相关术语和工具链非常陌生。我正在尝试建立一个静态库,客户可以在自己的项目中使用。理想情况下,除了.a和.lib文件,再加上.h文件外,我什么也不想发送。

现在,我的CMake文件如下所示:

project(ava-engine-client)
cmake_minimum_required(VERSION 3.9.6)
set(CMAKE_BUILD_TYPE Release)
set(CMAKE_FIND_LIBRARY_SUFFIXES .a )

add_compile_options(-std=c++11)

# GRPC and Protocol Buffers libraries location
list(APPEND CMAKE_PREFIX_PATH "/opt/grpc" "/opt/protobuf")

# CMake find modules
list(APPEND CMAKE_MODULE_PATH "${CMAKE_CURRENT_LIST_DIR}/cmake")


# Recurse and find all the generated Protobuf .cc files
file(GLOB_RECURSE PROTO_GEN_SRCS ${CMAKE_CURRENT_SOURCE_DIR}/ava_engine/ava/*.cc)

include_directories("${CMAKE_CURRENT_SOURCE_DIR}")

# Building the library
add_library(ava_engine_client STATIC src/AvaEngineClient.cc src/AvaEngineClient.h ${PROTO_GEN_SRCS})

target_link_libraries(ava_engine_client ${PROTOBUF_LIBRARIES} ${GRPC_LIBRARY})


## Building Playground
add_executable(playground src/Playground.cc)

target_link_libraries(playground ava_engine_client)
Run Code Online (Sandbox Code Playgroud)

现在,这在链接阶段失败了,因为我没有使用ava_engine_client库中的依赖项链接游乐场目标:

Undefined symbols for architecture x86_64:
  "grpc::ClientContext::ClientContext()", referenced from:
      ...
  "grpc::ClientContext::~ClientContext()", referenced from:
      ...
  "grpc::CreateChannel(std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> …
Run Code Online (Sandbox Code Playgroud)

c++ cmake

5
推荐指数
1
解决办法
2120
查看次数

使用cmake构建静态库的静态库

我正在尝试创建一个静态库的静态库。这是我的CMakeLists.txt

cmake_minimum_required(VERSION 2.8)

project(myRtspClient)

add_subdirectory(../third_party/Base64_live555 base64_live555)
add_subdirectory(../third_party/md5 md5)
add_subdirectory(../third_party/JRTPLIB jrtplib)

include_directories(include)
include_directories(../third_party/Base64_live555/include)
include_directories(../third_party/md5/include)
include_directories(jrtplib/src)
include_directories(../third_party/JRTPLIB/src)

file(GLOB SOURCES "*.cpp")

add_library(myRtspClient STATIC ${SOURCES})

add_library(libmd5 STATIC IMPORTED)
SET_PROPERTY(TARGET libmd5 PROPERTY IMPORTED_LOCATION ./md5/libmd5.a)

add_library(libbase64_live555 STATIC IMPORTED)
SET_PROPERTY(TARGET libbase64_live555 PROPERTY IMPORTED_LOCATION ./base64_live555/libbase64_live555.a)

add_library(libjrtp STATIC IMPORTED)
SET_PROPERTY(TARGET libjrtp PROPERTY IMPORTED_LOCATION ./jrtplib/src/librtp.a)

target_link_libraries(myRtspClient libmd5 libbase64_live555 libjrtp)
#install(TARGETS myRtspClient DESTINATION /usr/lib)
Run Code Online (Sandbox Code Playgroud)

如果您想查看整个图片:https : //github.com/lucaszanella/myRtspClient/blob/8658dbcb8ed071b8d2649a471455f57f268932f4/myRtspClient/CMakeLists.txt

如您所见,我正在尝试myRtspClient通过与链接来创建目标libmd5 libbase64_live555 libjrtp。由于cmake没有错误,即使我这样做

target_link_libraries(myRtspClient eewgg dsgsg dgsgsdgsg)
Run Code Online (Sandbox Code Playgroud)

我不确定这是什么错误。这些库在我指定的位置。但是,我不知道它们是否在第一次编译中。虽然我尝试了第二次,但是谁知道...

因此,继续...我尝试了很多SET_PROPERTY类似的方法:

SET_PROPERTY(TARGET libbase64_live555 PROPERTY IMPORTED_LOCATION ./base64_live555/libbase64_live555.a) …
Run Code Online (Sandbox Code Playgroud)

c++ linker build cmake linker-errors

2
推荐指数
1
解决办法
2372
查看次数

标签 统计

cmake ×4

c++ ×3

linker ×2

.a ×1

build ×1

linker-errors ×1

unix-ar ×1