我正在尝试使用在Linux上运行的CMake构建一个基于OpenCV的项目.到目前为止,我的CMakeLists.txt
文件看起来像
FIND_PACKAGE (OpenCV REQUIRED)
...
TARGET_LINK_LIBRARIES (my-executable ${OpenCV_LIBS})
Run Code Online (Sandbox Code Playgroud)
但这导致动态链接库.如何链接静态库?
我想编译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
静态使用的程序?
测试其他东西我偶然发现了一些我还没有想到的东西.
我们来看看这个片段:
#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) 直到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)
我不喜欢看到警告:-)任何人有类似的问题?
谢谢,
费尔南多
环境: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) Java 8之前的Java版本要求本机代码位于共享库中,但我已经阅读了Java 8,可以将静态链接库与JNI一起使用.我搜索了一些例子但找不到任何例子.
如何将JNI库静态链接到我的java应用程序?
java java-native-interface static-libraries static-linking java-8
我正在部署一个用gcc编译的小程序,4.3.2-1.1(Debian).该程序将部署在虚拟机模板上,范围从Debain 5到最前沿的Fedora,Ubuntu,Slackware,Arch等.
该程序依赖于Xen库中的某些符号,这些符号仅在不稳定的树中可用.因此,通过虚拟机模板上的相应软件包管理器安装Xen的库无法解决我的直接问题.
在我打包这些库的自己版本之前,我需要静态链接可执行文件.
gcc 4.3-x,默认情况下只包含静态链接时实际使用的符号,还是我应该传递给链接器的另一个优化标志?我知道静态链接很糟糕,我只是作为一个临时工作.
如何删除动态依赖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))?
在分发针对多个GNU/Linux发行版的单个Haskell二进制文件时,您是否看到任何其他可能导致当前所需列表中存在问题的依赖项?
笔记:
libgmp.a
不起作用(如何有选择地将某些系统库静态链接到Haskell程序二进制文件?)libgmp
仍然在ldd
输出中列出.问题:
我在我的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 ++?
提前致谢!
我正在尝试使用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
.
为什么不可能像其他所有函数一样静态链接这些函数?