标签: static-linking

我如何告诉cmake我希望我的项目静态链接库?

我正在尝试使用在Linux上运行的CMake构建一个基于OpenCV的项目.到目前为止,我的CMakeLists.txt文件看起来像

FIND_PACKAGE (OpenCV REQUIRED)
...
TARGET_LINK_LIBRARIES (my-executable ${OpenCV_LIBS})
Run Code Online (Sandbox Code Playgroud)

但这导致动态链接库.如何链接静态库?

linux opencv cmake static-libraries static-linking

19
推荐指数
4
解决办法
3万
查看次数

如何静态链接使用./configure的Linux软件?

我想编译NRPE静态,所以我可以将已编译的二进制文件复制到OmniOS服务器,我不希望在其上安装gcc.我更喜欢从存储库安装带有SSl支持的NRPE,但是这样不存在,所以我想自己编译它.但是,./configure脚本不包含它接缝的静态选项

~/nrpe-2.15# ./configure --help | grep static
~/nrpe-2.15# ./configure --help | grep share
  --datadir=DIR          read-only architecture-independent data [PREFIX/share]
  --sharedstatedir=DIR   modifiable architecture-independent data [PREFIX/com]
Run Code Online (Sandbox Code Playgroud)

如何编译configure静态使用的程序?

linux gcc configure static-linking omnios

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

不同机器之间std时钟的显着性能差异

测试其他东西我偶然发现了一些我还没有想到的东西.

我们来看看这个片段:

#include <iostream>
#include <chrono>

int main () {
  int i = 0;
  using namespace std::chrono_literals;

  auto const end = std::chrono::system_clock::now() + 5s;
  while (std::chrono::system_clock::now() < end) {
    ++i;
  }
  std::cout << i;
}
Run Code Online (Sandbox Code Playgroud)

我注意到计数在很大程度上取决于我执行它的机器.
我用gcc 7.3,8.2和clang 6.0编译了std=c++17 -O3.

在i7-4790(4.17.14-arch1-1-ARCH内核):〜3e8
但在Xeon E5-2630 v4(3.10.0-514.el7.x86_64)上:〜8e6

现在这是我想要理解的差异,所以我已经检查过了 perf stat -d

在i7上:

       4999.419546      task-clock:u (msec)       #    0.999 CPUs utilized          
                 0      context-switches:u        #    0.000 K/sec                  
                 0      cpu-migrations:u          #    0.000 K/sec                  
               120      page-faults:u             #    0.024 K/sec                  
    19,605,598,394      cycles:u                  #    3.922 GHz …
Run Code Online (Sandbox Code Playgroud)

c++ performance static-linking c++-chrono

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

Xcode 4 Final - 与armv6 libs链接时出现"armv6 armv7"问题

直到xcode 4 final(我在可用的时候使用3.latest和4 GM)这没有发生.当我升级到xcode 4最终版本时,我在尝试将armv7版本与我的非armv7库链接时开始出现链接错误(我的项目使用默认的标准armv6 armv7有效架构设置):

ld: warning: ignoring file ../bin/iOS static/arm/libssl.a, file was built for archive which is not the architecture being linked (armv7)
ld: warning: ignoring file ../bin/iOS static/arm/libcrypto.a, file was built for archive which is not the architecture being linked (armv7)
Undefined symbols for architecture armv7: -- list of symbols --
Run Code Online (Sandbox Code Playgroud)

armv6版本编译得很好,但整个编译过程失败,出现77个链接错误.

我理解这是预期的行为,它不会与armv6 lib链接到armv7.该修复程序仅将我的项目设置为armv6.我的问题是:为什么这在xcode的早期版本中有效?

如果我只设置为armv6,我会开始收到此警告:

Check dependencies

[BWARN]warning: all apps should include an armv7 architecture (current ARCHS = "armv6").
Run Code Online (Sandbox Code Playgroud)

我不喜欢看到警告:-)任何人有类似的问题?

谢谢,

费尔南多

iphone xcode static-linking armv7 armv6

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

c ++ linux双重破坏静态变量.链接符号重叠

环境:linux x64,编译器gcc 4.x

项目有以下结构:

static library "slib"
-- inside this library, there is static object "sobj"

dynamic library "dlib"
-- links statically "slib"

executable "exe":
-- links "slib" statically
-- links "dlib" dynamically
Run Code Online (Sandbox Code Playgroud)

在节目结束时,"sobj"被毁坏两次.这种行为是预期的,但是它在相同的内存地址被破坏了两次,即在析构函数中也是"this" - 因此存在双重破坏问题.我认为这是由于一些符号重叠.

这场冲突的解决方案是什么?也许一些链接选项?


这是测试用例:


main_exe.cpp

#include <cstdlib>

#include "static_lib.h"
#include "dynamic_lib.h"

int main(int argc, char *argv[])
{
    stat_useStatic();
    din_useStatic();
    return EXIT_SUCCESS;
}
Run Code Online (Sandbox Code Playgroud)

static_lib.h

#ifndef STATIC_LIB_H
#define STATIC_LIB_H

#include <cstdio>

void stat_useStatic();
struct CTest
{
    CTest(): status(isAlive)
    {
        printf("CTest() this=%d\n",this);
    }
    ~CTest()
    {
        printf("~CTest() this=%d, %s\n",this,status==isAlive?"is Alive":"is …
Run Code Online (Sandbox Code Playgroud)

c++ linux dynamic-linking static-linking

17
推荐指数
2
解决办法
3538
查看次数

将静态库与JNI链接

Java 8之前的Java版本要求本机代码位于共享库中,但我已经阅读了Java 8,可以将静态链接库与JNI一起使用.我搜索了一些例子但找不到任何例子.

如何将JNI库静态链接到我的java应用程序?

java java-native-interface static-libraries static-linking java-8

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

在与gcc静态链接时,如何仅包含已使用的符号?

我正在部署一个用gcc编译的小程序,4.3.2-1.1(Debian).该程序将部署在虚拟机模板上,范围从Debain 5到最前沿的Fedora,Ubuntu,Slackware,Arch等.

该程序依赖于Xen库中的某些符号,这些符号仅在不稳定的树中可用.因此,通过虚拟机模板上的相应软件包管理器安装Xen的库无法解决我的直接问题.

在我打包这些库的自己版本之前,我需要静态链接可执行文件.

gcc 4.3-x,默认情况下只包含静态链接时实际使用的符号,还是我应该传递给链接器的另一个优化标志?我知道静态链接很糟糕,我只是作为一个临时工作.

c linux gcc static-linking

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

使用GHC(+ LLVM)将GMP静态链接到Haskell应用程序

  1. 如何删除动态依赖libgmp并从中继续:

    linux-vdso.so.1 =>  (0x00007fffdccb1000)
    libgmp.so.10 => /usr/lib/x86_64-linux-gnu/libgmp.so.10 (0x00007fb01afc1000)
    libm.so.6 => /lib/x86_64-linux-gnu/libm.so.6 (0x00007fb01acc7000)
    librt.so.1 => /lib/x86_64-linux-gnu/librt.so.1 (0x00007fb01aabe000)
    libdl.so.2 => /lib/x86_64-linux-gnu/libdl.so.2 (0x00007fb01a8ba000)
    libpthread.so.0 => /lib/x86_64-linux-gnu/libpthread.so.0 (0x00007fb01a69d000)
    libc.so.6 => /lib/x86_64-linux-gnu/libc.so.6 (0x00007fb01a2df000)
    /lib64/ld-linux-x86-64.so.2 (0x00007fb01b249000)
    
    Run Code Online (Sandbox Code Playgroud)

    对此(目前需要):

    linux-vdso.so.1 =>  (0x00007fffdccb1000)
    libm.so.6 => /lib/x86_64-linux-gnu/libm.so.6 (0x00007fb01acc7000)
    librt.so.1 => /lib/x86_64-linux-gnu/librt.so.1 (0x00007fb01aabe000)
    libdl.so.2 => /lib/x86_64-linux-gnu/libdl.so.2 (0x00007fb01a8ba000)
    libpthread.so.0 => /lib/x86_64-linux-gnu/libpthread.so.0 (0x00007fb01a69d000)
    libc.so.6 => /lib/x86_64-linux-gnu/libc.so.6 (0x00007fb01a2df000)
    /lib64/ld-linux-x86-64.so.2 (0x00007fb01b249000)
    
    Run Code Online (Sandbox Code Playgroud)

    以干净,可移植的方式适用于所有GNU/Linux发行版(而不是搞乱BSD(包括OS X))?

  2. 在分发针对多个GNU/Linux发行版的单个Haskell二进制文件时,您是否看到任何其他可能导致当前所需列表中存在问题的依赖项?


笔记:

haskell ghc cabal static-linking

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

CMake:将libgcc和libstdc ++静态链接到共享库

问题:

我在我的Ubuntu 16.04安装上使用CMake和GCC4.9将glibcc/glibc ++链接到共享库时遇到问题.

附加条件:

加载共享库给出了Red Hat生产环境(我将其复制到)的问题,我相信因为它使用了不同的libstc ++版本(错误:找不到GLIBCXX_3_4_20).我没有sudo权限,无法升级机器.

正如我从这个博客派生的那篇文章,我尝试使用以下方法将静态链接与libgcc和libgc ++链接起来:

set(CMAKE_EXE_LINKER_FLAGS "-static-libgcc -static-libstdc++ -static")
Run Code Online (Sandbox Code Playgroud)

和使用

set(CMAKE_SHARED_LINKER_FLAGS "-static-libgcc -static-libstdc++ -static")
Run Code Online (Sandbox Code Playgroud)

但这不起作用.什么的工作是这样的CMake的脚本:

add_library(myLib SHARED ${SOURCE_FILES})
set(CMAKE_EXE_LINKER_FLAGS " -static")
target_link_libraries(myLib -static-libgcc -static-libstdc++)
Run Code Online (Sandbox Code Playgroud)

这一定是错误的做法,据我所知-static-libgcc和-static-libstdc ++是链接器选项而不是库......

问题:如何正确地链接-libgcc和-libstdc ++?

提前致谢!

c++ gcc g++ cmake static-linking

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

为什么不可能完全静态链接应用程序?

我正在尝试使用GCC编译静态链接的二进制文件,我收到的警告信息如下:

warning: Using 'getpwnam_r' in statically linked applications requires at runtime the shared libraries from the glibc version used for linking
Run Code Online (Sandbox Code Playgroud)

我甚至不知道是什么getwnam_r,但我认为它是从一些更高级别的API内部调用的.我收到了类似的消息gethostbyname.

为什么不可能像其他所有函数一样静态链接这些函数?

linux linker static-linking

15
推荐指数
1
解决办法
6083
查看次数