javascript

java

python

c#

android

c++

node.js

php

html

jquery

ios

reactjs

css

.net

git

ruby-on-rails

sql

c

ruby

string

首页> C#>如何使用不带-l或不遵循libNAME.so命名约定的库的硬编码路径的GCC进行链接?

我有一个共享库,希望将其链接为使用GCC的可执行文件。 共享库具有非标准名称,其格式不是libNAME.so,因此我不能使用通常的-l选项。 (它碰巧也是Python扩展,因此没有“ lib”前缀。)

我能够将库文件的路径直接传递给链接命令行,但这会导致库路径被硬编码到可执行文件中。

例如:

g++ -o build/bin/myapp build/bin/_mylib.so

有没有一种方法可以链接到该库而不会导致路径被硬编码到可执行文件中?

trans by 2020-08-11T21:38:43Z

macos-如何在Mac OSX下使用gcc设置可执行文件的运行时路径(-rpath)?

我想在Mac OSX下设置编译时可执行文件(用于链接器)的运行时路径,以便动态链接器在程序启动时找到非标准位置的共享库。

在Linux下,可以通过otool -L(或使用-Wl,-rpath,/path/to)来实现,而在Solaris下,可以将-R/path/to添加到编译器命令行中。

我发现一些信息表明Mac OS X gcc自10.5起(即自2008年以来)具有-rpath支持。

我试图用一个最小的例子来使它工作-没有成功:

$ cat blah.c 
int blah(int b)
{
  return b+1;
}

和:

$ cat main.c 

#include <stdio.h>

int blah(int);

int main ()
{
  printf("%d\n", blah(22));
  return 0;
}

像这样编译:

$ gcc -c  blah.c
$ gcc -dynamiclib blah.o -o libblah.dylib
$ gcc main.c -lblah -L`pwd`  -Xlinker -rpath -Xlinker `pwd`/t

现在测试:

$ mkdir t
$ mv libblah.dylib t
$ ./a.out
dyld: Library not loaded: libblah.dylib
  Referenced from: /Users/max/test/./a.out
  Reason: image not found
Trace/BPT trap

因此出现了问题:如何在Mac OSX下为链接器设置运行时路径?

顺便说一句,设置otool -L可以工作-但我不想使用此技巧。

编辑:关于otool -L

$ otool -L a.out 
a.out:
        libblah.dylib (compatibility version 0.0.0, current version 0.0.0)
        /usr/lib/libSystem.B.dylib (compatibility version 1.0.0, current version 125.2.1)

看来otool -L仅输出可执行文件所链接的库名(以及链接时的位置),而没有输出运行时路径信息。

trans by 2020-08-06T02:48:22Z

共享库-如何在Haskell项目中使用DLL?

我想在Haskell项目中使用外部库RDFox。

上下文:我正在使用GHC7.10和堆栈在64位的Windows和Linux上工作。 RDFox用C ++编程。 可以使用Java和Python包装程序下载RDFox共享库(.dll,.so)。

目的:我想在Haskell的项目中重复使用RDFox(.dll,.so)中已编译的库,因此我需要为RDFox创建一个Haskell包装器。

问题:对于Haskell来说,它相对较新,我很难知道从哪里开始。 我从Haskell Wiki和StackOverflow找到了几个有关该主题的页面,但是工作流程和配置对我来说还不清楚。

问题:我想知道:

  1. 如何配置堆栈和cabal以使用外部库,以在Windows或Linux(不同的机器,相同的存储库)上构建。
  2. 如何配置GHCi在此外部库上进行交互式测试。
  3. 将Python包装器翻译为Haskell是最好的方法吗? 我想避免对RDFox C ++代码的分析。
trans by 2020-08-05T09:48:25Z

macos-在OS X上创建Haskell共享库

我正在尝试从Haskell源代码创建共享库。

我尝试按照此处的说明进行操作:[http://weblog.haskell.cz/pivnik/building-a-shared-library-in-haskell/],但我没有运气。

当我使用Haskell 64位(从2011.4.0.0开始的ghc 7.0.4)进行编译时,出现以下错误:

ld: pointer in read-only segment not allowed in slidable image, used in 
                 ___gmpn_modexact_1c_odd 

作为替代方案,我也尝试了32位版本,并根据我用来链接的确切标志获取错误,例如:

Library not loaded: /usr/local/lib/ghc-7.0.4/base-4.3.1.0/libHSbase-4.3.1.0-ghc7.0.4.dylib

通过将-lHSrts添加到链接器行,我确实设法进一步了。 这使我成功地链接和加载了库,但是后来我无法使用dlsym(或手动使用nm | grep)找到函数名称。

任何提示将不胜感激,示例make文件或在OS X上成功构建(和使用)共享库的构建行将不胜感激。 我对Haskell还是很陌生,并且不知道假设问题已经解决了,还是应该出于某种原因而继续努力,或者出于各种原因,我不希望这在OS X上起作用。

我尝试过的所有组合的git repo可以在这里找到:[https://github.com/bennoleslie/haskell-shared-example]我确实设法使某些东西适用于32位ghc,但不适用于64位 然而。

trans by 2020-08-02T01:09:43Z

c-Windows API函数名称中的“ Ex”代表什么?

在Windows API和其他各种库中,我看到了方法的多个入口点,我注意到在MyApiCall和MyApiCallEx等方案中使用了Ex的缩写。

我的假设是,这代表Extension还是Extra,有人可以确认吗?

任何关于为什么选择Ex而不是选择MyApiCall2或类似名称的历史都将不胜感激。

trans by 2020-07-24T01:37:02Z

c-用相同的符号链接两个共享库

我链接了两个不同的共享库。 这两个库都定义了一些共享名称但具有不同实现的符号。 我不能使每个库都使用自己的实现。

例如,两个库都定义了一个全局函数foo2(),每个函数都在内部调用。 图书馆一称它为foo1(),图书馆二称它为foo2()

lib1.so:

T bar
T foo1()     // calls bar()

lib2.so:

T bar
T foo2()     // calls bar()

如果我将应用程序链接到Lib1.so然后将Lib2.so链接,即使调用foo2()时,也会调用Lib1.so的bar实现。 总是从Lib2.so调用。

有没有办法使一个库始终比其他任何库更喜欢其自己的实现?

trans by 2020-07-20T18:12:06Z

链接器-链接共享库时限制符号的可见性

某些平台要求您向链接器提供共享库的外部符号列表。 但是,在大多数unixish系统上,这不是必需的:默认情况下,所有非静态符号都将可用。

我的理解是,GNU工具链可以选择性地将可见性限制为明确声明的符号。 如何使用GNU ld来实现?

trans by 2020-07-09T23:20:57Z

javascript-JS-无法合并lib文件

我在index.html文件中有多个lib文件,这些文件以正确的顺序针对正在运行的应用程序加载。

<!-- example of some of them... -->
<script src="/./sys/lib/jquery.min.js"></script>
<script src="/./sys/lib/jquery.ui.min.js"></script>
<script src="/./sys/lib/jquery.easing.min.js"></script>
<script src="/./sys/lib/underscore.min.js"></script>
<script src="/./sys/lib/handlebars.min.js"></script>
<script src="/./sys/lib/backbone.min.js"></script>
<script src="/./sys/lib/moment.min.js"></script>
<script src="/./sys/lib/libs.extensions.js"></script>

这些运行正常,它们已经全部缩小了。

现在,我想将所有这些组合到一个文件中以提高加载速度:

<script src="/./sys/lib/libs.all.js"></script>

因此,我打开了新的libs.all.js文件,并按照与上面列出的完全相同的顺序,将零碎的.js文件粘贴到文件中,并进行了零修改。 在我进入moment.js之前,这一直有效。 然后将其粘贴并运行时,出现JS错误。

TypeError: (intermediate value)(...) is not a function

我没有得到我所缺少的内容-如果在将它们同步加载到HTML文件中时以正确的顺序粘贴它们,有什么区别?

trans by 2020-07-05T02:29:51Z

链接器-CMake:如何“尽可能静态”地生成二进制文件

我想控制在CMake中与我的二进制文件找到/链接的库的类型。 最终目标是“尽可能静态地”生成二进制文件,该二进制文件将与每个具有静态可用版本的库进行静态链接。 这很重要,因为这样可以在测试过程中跨不同系统移植二进制文件。

在ATM上,这很难实现,因为FindXXX.cmake包,或者更确切地说,只要静态和动态可用,find_library命令总是选择动态库。

非常欢迎您提供有关如何实现此功能的提示-最好以一种优雅的方式!

trans by 2020-06-23T08:52:49Z

linux-构建共享库的“ soname”选项是什么?

我学习了“程序库指南”。 它提到使用soname来管理如下版本。

gcc -shared -fPIC -Wl,-soname,libfoo.so.1  -o libfoo.so.1.0.0 foo.c
ln -s libfoo.so.1.0.0  libfoo.so.1
ln -s libfoo.so.1 libfoo.so

而且我得到的信息是,如果未设置soname。 它将等于libfoo.so.1.0.0,请参见此处的答案。

而且我发现它也可以在没有soname的情况下工作,例如

 gcc -shared -fPIC -o libfoo.so.1.0.0 foo.c
 ln -s libfoo.so.1.0.0  libfoo.so.1
 ln -s libfoo.so.1 libfoo.so

因此,我认为唯一有用的一点是,当您使用readelf -d libfoo.so命令检查共享库时,soname选项可以告诉您共享库的版本。

它还能做什么?

trans by 2020-06-16T23:18:30Z

c-建立.so也是可执行文件

因此,每个人都可能知道glibc的/lib/libc.so.6可以像普通可执行文件一样在shell中执行,在这种情况下,它会打印其版本信息并退出。 这是通过在.so中定义一个入口点来完成的。 在某些情况下,将其用于其他项目也可能很有趣。 不幸的是,您可以通过ld的-e选项设置的低级入口点有点低级:动态加载程序不可用,因此您无法调用任何适当的库函数。 因此,glibc通过该入口点中的裸系统调用来实现write()系统调用。

我现在的问题是,谁能想到一种好方法,如何从该入口点引导一个完整的动态链接器,以便一个人可以从其他.so存取功能?

trans by 2020-02-29T19:19:24Z

CMake:如何从子项目的所有静态库中创建一个共享库?

我有以下布局:

top_project
    + subproject1
    + subproject2

add_libraryadd_library(${PROJECT_NAME} SHARED subproject1 subproject2)各自创建一个静态库。 我想将这些静态库链接到top_project级别的单个共享库中。

到目前为止,我收集的信息是:

  • 为了创建与位置无关的代码,可以使用add_library(在Windows以外的所有平台上都是必需的)进行编译,以允许将静态库链接到单个共享库中,或者将所有静态库解压缩(例如,使用add_library(${PROJECT_NAME} SHARED subproject1 subproject2))并将它们重新链接到共享库中 (我认为这是一种优雅且不可移植的解决方案)
  • 必须将所有源文件显式提供给add_library命令:由于某种我无法理解的原因,仅编写add_library(${PROJECT_NAME} SHARED subproject1 subproject2)不能按预期工作(它实际上创建了一个空库,并且未正确注册依赖项)
  • CMake中有一个OBJECT库功能,但我认为它的目的并不是真正做到我想要的。

有什么想法吗?

trans by 2020-02-29T10:46:26Z

如何检查给定进程在运行时加载了哪些共享库?

有没有办法检查正在运行的进程在使用哪些库?

更具体地说,如果程序使用dlopen加载某些共享库,则readelf或ldd不会显示它。是否有可能从正在运行的进程中获取该信息? 如果是,怎么办?

trans by 2020-02-21T13:40:29Z

强制GCC通知共享库中的未定义引用

我有一个与另一个(第三方)共享库链接的共享库。 然后,在我的应用程序中使用dlopen加载我的共享库。 所有这些都可以正常工作(假设文件位于正确的路径中,等等)。

现在的问题是,当我链接库时,甚至不需要指定要链接到第三方共享库的链接。 GCC接受它时不会报告有关未定义引用的错误。 所以,这个问题; 如何强制GCC通知我有关未定义引用的信息?

如果我将库更改为(临时)可执行文件,则将获得未定义的引用(当不将库提供给链接器时)。 (如果指定,效果很好。)

即,完成以下操作:

g++ -fPIC -shared -o libb.so b.o 
g++ -fPIC -shared -o liba.so a.o
g++ -o a.exe a.cpp 

第二行不显示错误,第三行抱怨未定义的引用。

样例代码:

啊:

class a
{
public:
    void foobar();
};

a.cpp:

#include "a.h"
#include "b.h"

void a::foobar()
{
    b myB;
    myB.foobar();
}

int main()
{
    a myA; myA.foobar();
}

b.h:

class b
{
public:
    void foobar();
};

b.cpp:

#include "b.h"

void b::foobar()
{
}
trans by 2020-02-20T08:17:18Z

从C优雅地调用C ++

我们在普通C(C99)中开发了一些项目。 但是,在C++中,我们有一个库作为源代码(数学库)。我们需要这个库,所以我想问,集成此源代码的最优雅的方法是什么?

CC++的尺寸之比为20:1,因此无法选择使用C++。 我们应该使用静态库吗? DLL? (全部在Windows上)。

trans by 2020-02-15T12:39:33Z

c-为什么LIB文件具有如此双重的性质?

我正在尝试了解Microsoft Windows上的LIB文件业务,并且我刚刚做出了一项发现,该发现将消除我迄今使我无法清楚地了解此问题的困惑。 也就是说,LIB文件不是其文件扩展名所建议的一种文件。

:: cd "C:\Program Files (x86)\Microsoft SDKs\Windows\v7.0A\Lib"

:: lib /nologo /list Ad1.Lib
obj\i386\activdbgid.obj
obj\i386\activscpid.obj
obj\i386\ad1exid.obj
obj\i386\dbgpropid.obj
obj\i386\dispexid.obj

:: lib /nologo /list oledb.lib
o:\winmain.obj.x86fre\enduser\…\oledb\uuid\objfre\i386\oledbiid.obj
o:\winmain.obj.x86fre\enduser\…\oledb\uuid\objfre\i386\oledbnewiid.obj
o:\winmain.obj.x86fre\enduser\…\oledb\uuid\objfre\i386\cmdtreeiid.obj
o:\winmain.obj.x86fre\enduser\…\oledb\uuid\objfre\i386\oledbdepiid.obj

:: lib /nologo /list AdvAPI32.Lib | sort | uniq -c
    731 ADVAPI32.dll

前两个示例包含目标文件(在.ILB实用程序显示时显示为相对或绝对路径)。 但是,第三个示例仅包含731对DLL的引用。 (我想.so并非旨在显示此类文件的更多有用信息。)

有些包含目标文件,它们是静态库。 其他包含符号,它们是导入库。 (这里有一个简短的解释。)

因此,静态库在Linux上似乎等同于.ILB文件,而DLL在Linux上似乎映射到.so文件。 (顺便说一句,导入库如何适合此Windows / Linux等效图片?)

现在我想知道为什么会这样吗? Microsoft为什么决定为导入库提供与静态库相同的文件扩展名? (我知道,从历史上看,静态库是最先出现的,就像原始的生命形式先于更复杂的形式一样。)为什么他们不说,好的,这是这些新类型的库,它们将被称为导入库,它们应该被称为导入库。 带有文件扩展名.ILB(或其他文件)?

trans by 2020-02-08T18:23:21Z

共享库-Tomcat是否在两个Web应用程序中两次将相同的库文件加载到内存中?

我在tomcat/server/lib文件夹下有两个应用程序。

tomcat/webapps/App1
tomcat/webapps/App2

两个应用程序共享相同的库。 例如将其存储在tomcat/server/lib中。

两个库是否都在内存中加载了两次?

我应该将这些共享库放在tomcat/server/lib中吗?

trans by 2020-02-05T08:26:10Z

c-将静态库转换为共享库?

我有一个第三方库,主要由大量的静态(.a)库文件组成。 我可以将其编译为单个.so库文件,但我真的需要将其作为单个.a共享库文件。

有什么方法可以将静态.a文件转换为共享的.so文件? 或更笼统地说,是否存在将大量静态.a文件与少数.o对象文件组合为单个.so文件的好方法?

trans by 2020-01-26T01:26:36Z

gcc-如何通过objdump判断是否已使用-fPIC构建了目标文件?

如何使用objdump之类的信息来判断是否已使用-fPIC构建了目标文件?

trans by 2020-01-16T01:24:11Z

反对链接E“ R_X86_64_32S”

我正在尝试将静态库链接到共享库,但出现以下错误

/usr/bin/ld: ../../../libraries/log4cplus/liblog4cplus.a(fileappender.o): relocation R_X86_64_32S against `a local symbol' can not be used when making a shared object; recompile with -fPIC
../../../libraries/log4cplus/liblog4cplus.a: could not read symbols: Bad value
collect2: ld returned 1 exit status

但这可以在32位计算机上工作,而不会出现任何此类错误。 我尝试将g++ -shared -fPIC -frtti -I"Include_Directory" -o mysofile.so myfile.o -Wl,--whole-archive "../../../libraries/log4cplus/liblog4cplus.a" -Wl,--no-whole-archive -ldl标志手动添加到Makefile中,但也不能解决问题

我尝试了此处建议的g++ -shared -fPIC -frtti -I"Include_Directory" -o mysofile.so myfile.o -Wl,--whole-archive "../../../libraries/log4cplus/liblog4cplus.a" -Wl,--no-whole-archive -ldl标志,但没有成功。

 
/usr/bin/ld: ../../../libraries/log4cplus/liblog4cplus.a(appenderattachableimpl.o): relocation R_X86_64_32S against `vtable for log4cplus::spi::AppenderAttachable' can not be used when making a shared object; recompile with -fPIC
../../../libraries/log4cplus/liblog4cplus.a(appenderattachableimpl.o): could not read symbols: Bad value
collect2: ld returned 1 exit status

创建liblog4cplus.a:

  1. g++ -shared -fPIC -frtti -I"Include_Directory" -o mysofile.so myfile.o -Wl,--whole-archive "../../../libraries/log4cplus/liblog4cplus.a" -Wl,--no-whole-archive -ldl
  2. g++ -shared -fPIC -frtti -I"Include_Directory" -o mysofile.so myfile.o -Wl,--whole-archive "../../../libraries/log4cplus/liblog4cplus.a" -Wl,--no-whole-archive -ldl
  3. g++ -shared -fPIC -frtti -I"Include_Directory" -o mysofile.so myfile.o -Wl,--whole-archive "../../../libraries/log4cplus/liblog4cplus.a" -Wl,--no-whole-archive -ldl并将-fPIC添加到CXXFLAGS和CFLAGS
  4. g++ -shared -fPIC -frtti -I"Include_Directory" -o mysofile.so myfile.o -Wl,--whole-archive "../../../libraries/log4cplus/liblog4cplus.a" -Wl,--no-whole-archive -ldl

然后用于编译我的共享库:

  1. g++ -shared -fPIC -frtti -I"Include_Directory" -o mysofile.so myfile.o -Wl,--whole-archive "../../../libraries/log4cplus/liblog4cplus.a" -Wl,--no-whole-archive -ldl
  2. g++ -shared -fPIC -frtti -I"Include_Directory" -o mysofile.so myfile.o -Wl,--whole-archive "../../../libraries/log4cplus/liblog4cplus.a" -Wl,--no-whole-archive -ldl
trans by 2020-01-10T19:29:38Z

1 2 3 下一页 共3页