标签: static-linking

C++应用程序 - 我应该为库使用静态或动态链接吗?

我将开始一个新的C++项目,该项目将依赖于一系列库,包括部分Boost库,log4cxx或google日志库 - 并且随着项目的发展,其他项目(我还没有预料到) .

它必须在32位和64位系统上运行,很可能是在一个非常多样化的Linux环境中,我不希望所有必需的库都可​​用,也不需要su权限.

我的问题是,我应该通过动态或静态链接到所有这些库来构建我的应用程序吗?

笔记:

(1)我知道静态链接在开发过程中可能会很痛苦(编译时间较长,32位和64位交叉编译,依赖链包含所有库等),但在测试过程中更容易 - 只需移动文件即可运行.

(2)另一方面,动态链接接缝在开发阶段更容易 - 编译时间短(不知道如何处理来自我的32位开发环境的64位库的动态链接),没有依赖链的喧嚣.另一方面,新版本的部署可能很难看 - 特别是在需要新库时(参见上述条件,目标机器上没有su权限,也没有这些库可用).

(3)我已阅读有关此主题的相关问题,但无法确定哪种方法最适合我的方案.

结论:

  1. 谢谢大家的意见!
  2. 我可能会使用静态链接,因为:
    • 部署更容易
    • 在perf期间可预测的性能和更一致的结果.测试(见本文:http://www.inf.usi.ch/faculty/hauswirth/publications/CU-CS-1042-08.pdf)
    • 正如所指出的,静态与动态编译的大小和持续时间似乎并没有那么大的差异
    • 更简单,更快速的测试周期
    • 我可以保留所有的开发.循环我的开发.机

c++ boost cross-compiling dynamic-linking static-linking

13
推荐指数
1
解决办法
4372
查看次数

在visual studio中如何将所有.libs包含在一个文件夹中

我正在尝试用另一个项目构建一个项目.那里有很多库,我不确定所需的未引用符号在哪里.

有没有办法.lib在编译时包含所有文件?

我已将该lib目录作为链接器的附加输入,但它要求包含单个.lib文件.是否可以选择.lib在此文件夹中包含所有内容?

static-linking visual-studio visual-c++

13
推荐指数
3
解决办法
9757
查看次数

在C中,是否可以将导出的函数名称更改为不同的名称?

所有.

我想链接一个调用malloc()函数的库.但是,我的目标环境是不同的,并 malloc()作为内联函数提供.

如何将库的调用malloc()指向我的目标环境的malloc()例程?

是否可以更改导出的函数名称?如果是这样,我可以my_malloc()先编码并将其导出为malloc()并将库链接到该库:

#include <my_environment.h>  // malloc() is inline function declared there 
void my_malloc (void) {
   malloc (void);             
}
Run Code Online (Sandbox Code Playgroud)

更具体地说,该库是来自linux发行版的库,因此它依赖于libc.但我的环境嵌入了一个,没有libc库和malloc(),free()......是定制的实现.一些是内联函数,一些是库函数.

c linker inline static-linking

13
推荐指数
1
解决办法
3787
查看次数

使用'boost :: system :: get_system_category()'的未定义引用链接boost barf

我无法静态链接使用boost 1.35库的应用程序.我正在使用一个带有G ++ 4.3.2的linux debian Lenny盒子.没有静态链接没有静态工作.

特别,

g++ -Wall -Wextra  -pedantic -ggdb3 -O0  -static -l boost_thread-mt -lboost_system-mt -lboost_program_options-mt -lssl -lpthread -l crypto  main.o comandos.o utils.o tunnel.o opciones.o decode.o sysutils.o -o sapp  

main.o: In function `__static_initialization_and_destruction_0':
/usr/include/boost/system/error_code.hpp:204:undefined reference to `boost::system::get_system_category()'
/usr/include/boost/system/error_code.hpp:205: undefined reference to `boost::system::get_posix_category()'
/usr/include/boost/system/error_code.hpp:209: undefined reference to `boost::system::get_posix_category()'
/usr/include/boost/system/error_code.hpp:210: undefined reference to `boost::system::get_system_category()'
Run Code Online (Sandbox Code Playgroud)

我正在连接boost_system-mt,它位于/ usr/lib的盒子里.如果我链接到boost_system的非多线程安全版本(-lboost_system),会发生同样的事情

sarraga@saggy:~/sapp/src$ ls -al /usr/lib/libboost_system*a
-rw-r--r-- 1 root root 23506 2008-05-23 05:32 /usr/lib/libboost_system.a
lrwxrwxrwx 1 root root    17 2010-08-26 19:10 /usr/lib/libboost_system-gcc42-1_35.a …
Run Code Online (Sandbox Code Playgroud)

c++ linker boost static-linking

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

C和C++静态链接:只是一个副本?

当某人静态链接.lib时,链接器会将lib的全部内容复制到最终的可执行文件中,还是只复制目标文件中使用的函数?

c c++ linker static-linking

12
推荐指数
2
解决办法
2134
查看次数

如何将LC_LOAD_DYLIB命令插入Mach-O二进制文件或将静态库加入现有二进制文件(IOS)

这是我第一次询问stackoverflow,我很绝望.

我的任务是加载一个dylib或将静态库加入到IOS设备的现有可执行文件中.

我将使用它static void __attribute__((constructor)) initialize(void)开始调配.这个可执行文件适用于内部企业appstore,所以我不需要通过苹果appstore(因为他们会拒绝它).

这样做的原因是从客户及其签名密钥获取现有IPA,并为其应用程序添加新功能,而无需开发人员干预.

有一家公司正在做这个叫做nukona.您可以在此处观看电影:https://www.youtube.com/watch?feature = player_embedded&v = z9rrOB6lOxY

我可以告诉你,我试图将LSEnvironment放在plist文件中DYLD_INSERT_LIBRARIES但是事实证明LSEnvironment似乎对IOS应用程序的沙箱没有任何影响.

我还尝试使用install_name_tool来更改其中一个依赖项,并将其替换为我的dylib(也具有该依赖项).它没有信息崩溃原因.

显然,如果我将dylib添加到XCode中的测试应用程序并重新编译它是完美的,这是给定的.但是,这是我不能要求的,例如,公司的管理员.重建可能会阻止客户使用此库.

这是我在堆栈溢出时发现的相关链接,但对于osx,我需要它用于IOS. 如何将LC_LOAD_DYLIB命令插入Mach-O二进制文件(OSX)

我唯一可以想到的是编辑二进制加载命令一些如何,但我不知道如何以及如何做到这一点考虑到重定位表等...

欢迎任何替代方案.

感谢您的时间.

mach-o dynamic-linking static-linking ios

12
推荐指数
1
解决办法
4170
查看次数

CMake on Linux:"目标平台不支持动态链接"

我很简单 CMakeLists.txt

CMAKE_MINIMUM_REQUIRED(VERSION 2.8)
FIND_PACKAGE(VTK REQUIRED)
PROJECT(test CXX)
Run Code Online (Sandbox Code Playgroud)

那真的什么都没做.正确找到VTK包/usr/lib/vtk-5.8/VTKConfig.cmake.该文件包含许多类型的语句

ADD_LIBRARY(foobar SHARED IMPORTED)
Run Code Online (Sandbox Code Playgroud)

表示共享库libfoobar.so需要在可执行文件中链接.

然而,在使用上述脚本创建Makefile时,CMake会抱怨

CMake Warning (dev) at /usr/lib/vtk-5.8/VTKTargets.cmake:244 (ADD_LIBRARY):
  ADD_LIBRARY called with SHARED option but the target platform does not
  support dynamic linking.  Building a STATIC library instead.  This may lead
  to problems.
Call Stack (most recent call first):
  /usr/lib/vtk-5.8/VTKConfig.cmake:200 (INCLUDE)
  /usr/share/cmake-2.8/Modules/FindVTK.cmake:73 (FIND_PACKAGE)
  CMakeLists.txt:4 (FIND_PACKAGE)
This warning is for project developers.  Use -Wno-dev to suppress it
Run Code Online (Sandbox Code Playgroud)

这个警告意味着什么,它是如何处理的?

这是一个使用CMake 2.8.9的Linux系统.虽然对于包含的所有软件包都会显示此错误消息ADD_LIBRARY(foobar SHARED IMPORTED),但此处将使用VTK-5.8作为示例.

cmake dynamic-linking static-linking

12
推荐指数
2
解决办法
4425
查看次数

SDL2库的静态链接

我使用的是Windows 7,Code :: Blocks和MinGW.在编译/构建任何东西时,我几乎没有经验,特别是当Code :: Blocks不使用makefile时.

我从http://www.libsdl.org/tmp/download-2.0.php下载了SDL2-devel-2.0.0-mingw.tar.gz(SDL开发库),我想创建一个独立的可执行文件SDL2库,但到目前为止,我总是不得不将SDL2.dll文件与可执行文件捆绑在一起以使其工作.

我听说我不能静态链接动态库,所以我唯一的选择似乎是使用上面提到的链接中的文件SDL2-2.0.0.tar.gz(源代码)对源文件做些什么.但是,我不知道我该怎么办.

我设法尝试使用源文件是将Visual Studio项目导入Code :: Blocks并构建它,但它告诉我"sdl-config没有这样的文件或目录"(我不知道触发了什么).我也不确定构建只是给了我一个可执行文件,我不知道如何将它链接到我自己的可执行文件.

一个傻瓜证明白痴的一步一步指导将是解决这个案件的最佳选择.

编辑:

我设法用Jonas提供的指南编译SDL库,并获得了一个libSDL2.a文件.

起初我只将libSDL2.a的路径添加到Code :: Blocks的"链接库:"部分,但是我收到了一堆错误,例如"SDL_Init()未在此范围内声明".

除了libSDL2.a路径之外,我还将SDL2-2.0.0\include的路径添加到编译器的搜索目录以及SDL2-2.0.0\build.libs到链接器搜索目录的路径.我还把它写到我的测试文件中:#include"SDL.h".我的测试文件现在看起来像这样:

#include "SDL.h"

int main( int argc, char* args[] ) {
    //Start SDL
    SDL_Init( SDL_INIT_EVERYTHING );
    //Quit SDL
    SDL_Quit();
    return 0;
}
Run Code Online (Sandbox Code Playgroud)

它似乎确实解决了声明问题,但现在Code :: Blocks打开了一个SDL_mmjoystick.c文件并给了我更多错误:"未定义引用'waveInClose @ 4'","未定义引用'waveOutClose @ 4'", "对'joyGetNumDevs @ 0'的未定义引用"和其他大量的引用.

这是正在发生的事情的屏幕截图,注意#include文本的不同颜色,我不确定为什么会发生这种情况:http://gyazo.com/00656a9c1e57a2bd0db1414fa7d68ced.png

我不确定如何正确使用此库.在这种情况下有任何帮助,还是我应该为此提出另一个问题?

编辑:

我将-lSDL2添加到链接器选项并删除了其他参数.现在它构建良好:

mingw32-g++.exe -Wall -fexceptions  -g    -IC:\Users\User\Desktop\SDL2-2.0.0\include  -c "C:\Users\User\Desktop\CppProjects\SDL project\main.cpp" -o obj\Debug\main.o
mingw32-g++.exe -Wall -fexceptions  -g    -IC:\Users\User\Desktop\SDL2-2.0.0\include  -c "C:\Users\User\Desktop\CppProjects\SDL project\thetestfile.cpp" -o obj\Debug\thetestfile.o
mingw32-g++.exe …
Run Code Online (Sandbox Code Playgroud)

sdl codeblocks static-linking sdl-2

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

如何在C/C++中使用OpenSSL进行静态链接

我用C和C++编写了Openssl的简单应用程序.我像这样编译它们:

gcc openssltest.c -o openssltest -lcrypto
g++ openssltest.cpp -o openssltest -lcrypto
Run Code Online (Sandbox Code Playgroud)

当你安装了Openssl时,它一切正常但是只有.

我想编译它,我可以在没有Openssl installend(类似Linux的操作系统)的操作系统上运行它们.我试过这个:

gcc -c openssltest.c -lcrypto -static
gcc openssltest.o -o openssltest -lcrypto -static
Run Code Online (Sandbox Code Playgroud)

和C++相同:

g++ -c openssltest.cpp -lcrypto -static
g++ openssltest.o -o openssltest -lcrypto -static
Run Code Online (Sandbox Code Playgroud)

但是有这些错误:

/usr/lib/gcc/x86_64-linux-gnu/4.7/../../../x86_64-linux-gnu/libcrypto.a(dso_dlfcn.o): In function `dlfcn_globallookup':
(.text+0x19): undefined reference to `dlopen'
/usr/lib/gcc/x86_64-linux-gnu/4.7/../../../x86_64-linux-gnu/libcrypto.a(dso_dlfcn.o): In function `dlfcn_globallookup':
(.text+0x2c): undefined reference to `dlsym'
/usr/lib/gcc/x86_64-linux-gnu/4.7/../../../x86_64-linux-gnu/libcrypto.a(dso_dlfcn.o): In function `dlfcn_globallookup':
(.text+0x37): undefined reference to `dlclose'
/usr/lib/gcc/x86_64-linux-gnu/4.7/../../../x86_64-linux-gnu/libcrypto.a(dso_dlfcn.o): In function `dlfcn_bind_func':
(.text+0x354): undefined reference to `dlsym'
/usr/lib/gcc/x86_64-linux-gnu/4.7/../../../x86_64-linux-gnu/libcrypto.a(dso_dlfcn.o): In function `dlfcn_bind_func':
(.text+0x3fb): undefined …
Run Code Online (Sandbox Code Playgroud)

c c++ linker static static-linking

12
推荐指数
2
解决办法
2万
查看次数

ar中的"rcs"选项有什么作用?

我确实阅读了man文件,但它没有帮助."rcs"似乎是传递给ar的最受欢迎的选项,但其含义并不是那么清楚.

所以"c"意味着创建一个新的档案,但为什么要使用"r"?哪个似乎代表"替换"?"s"选项对输出的作用是什么?

c gcc static-libraries unix-ar static-linking

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