关于创建和理解动态库中使用的技术的官方“如何”在哪里?我正在使用 g++ 编译器。我用谷歌搜索了这个问题,但找不到任何关于此的官方信息。
一旦应用程序与它所需的动态库链接,是否有可能找出哪个确切的库已经拉入了我在列表中看到的另一个库?
例如,今天我遇到了一个情况,一个本来不应该存在的库出现在ldd输出中,并且导致应用程序崩溃。通过逻辑推论,我可以弄清楚并隔离问题,然后重建相应的项目以不再包含错误的库。但是是否有可能在没有关于应用程序及其依赖的库的任何额外知识的情况下,使用来自诸如此类的外部工具来做同样的事情ldd?(问题是所讨论的库没有被应用程序直接使用,而是被应用程序直接链接到的另一个库使用。)
从本质上讲,一旦应用程序链接在一起,我似乎正在寻找一种方法来恢复链接依赖图。
我在我的Ubuntu系统中写了这样的代码:
我的.h
#include <stdio.h>
int a;
int set(void);
Run Code Online (Sandbox Code Playgroud)
库文件
#include "my.h"
int set(void) {
a = 100;
return 0;
}
Run Code Online (Sandbox Code Playgroud)
主程序
#include "my.h"
int main(void){
set();
printf("a = %d\n", a);
return 0;
}
Run Code Online (Sandbox Code Playgroud)
然后我使用以下命令来构建它们:
gcc -shared -fPIC -o libmy.so -I. lib.c
gcc -L. -lmy -I. -o test main.c
Run Code Online (Sandbox Code Playgroud)
当我构建测试时,我收到错误信息:
main.c:(.text+0x5):undefined reference to 'set'
collect2: error: ld returned 1 exit status
Run Code Online (Sandbox Code Playgroud)
但是当我使用在 Fedora23 和 Fedora24 中运行的相同代码时,它运行良好。
所以我想知道为什么会发生这种情况?Ubuntu系统有什么限制吗?
我想在我的iOs应用程序中使用动态链接库.我的问题是我读到我只能使用静态库.我在Apple官方网站上搜索过这个,但我找不到任何相关信息.有人能指出苹果官方信息的链接,说我在iOS项目中无法使用动态链接库吗?
伙计们,假设我有一个c ++应用程序/库运行实现说
/* Alloc API */
void* my_alloc(int size) {
return malloc(sizeof(size));
}
Run Code Online (Sandbox Code Playgroud)
这不是"extern c".
我有一个C动态库,我需要调用my_alloc,我可以直接调用该API吗?
Like,
int test_my_alloc (int size) {
int *x;
x = (int*)my_alloc(size);
if (x == NULL) {
return 0;
} else {
return 1;
}
}
Run Code Online (Sandbox Code Playgroud) 我想在Linux上运行基于Qt 5的应用程序usind动态库.总之,脚本会将可执行文件和其他相关文件(包括lib文件夹中所有必需的.so)复制到所需目标,并且脚本调用gksudo将作为应用程序的调用者.
直到我调用可执行脚本直到现在一切正常:应用程序无法运行.当我要求运行时sudo,它告诉我库(Qt5SerialPort ...)丢失了.运行ldd实际的可执行文件我发现应用程序正在从lib文件夹中获取所需的库,但是一些明显的硬编码路径.
我尝试通过使用解决这个问题,qt.conf但没有成功.在这里注意,似乎qt.conf实际上并不应该以这种方式工作.咨询Qt文档,我决定用LD_LIBRARY_PATH链接器告诉链接器在哪里找到libs,因为我已经使用脚本来运行应用程序了.所以最终的,总结的脚本代码是
#!/bin/sh
LD_LIBRARY_PATH=lib/
export LD_LIBRARY_PATH
sudo ldconfig #sometimes sudo /sbin/ldconfig -v
gksudo "$INSPATH/myApp" #or sudo instead
Run Code Online (Sandbox Code Playgroud)
问题是它仍然无法正常工作.当我打电话时echo $LD_LIBRARY_PATH,我可以看到变量被正确编辑,但当我调用运行行(使用sudo)时,它一直告诉我没有找到lib.
我错过了什么?
我正在将 Visual Studio C++ 框架转换为 Linux 版本,并且在消除 Windows 依赖项的过程中,我在一些头文件中遇到了一大堆 __declspec(dllimport) 调用。这些头文件定义了源文件中使用的一堆函数和类,因此构建需要它们。
下面是使用 __declspec() 调用的确切行。
#ifndef UeiDaqAPI
#define UeiDaqAPI __declspec(dllimport)
#endif
Run Code Online (Sandbox Code Playgroud)
UeiDaqAPI 是所有源文件使用的类和函数的集合。据我了解, declspec 调用将当前 .h 文件中定义的函数/类链接到动态库“UeiDaqAPI”
Linux 不支持 __declspec(dllimport),因此我尝试使用 dlopen() 进行“解决方法”。有关更多背景信息,大约 40 个头文件使用上面的 __declspec() 调用,因此测试任何解决方法都非常乏味。我得到了一个 Linux 动态库,采用我应该使用的 .so 格式。
我找到了一个使用 dlopen(path-to-library) 的示例,它应该允许我绕过 __declspec() 调用,但我不确定如何让它正常工作。到目前为止,我已尝试遵循该示例,并更改了所有 40 个左右的头文件,并将 __declspec() 调用替换为以下内容:
#ifndef UeiDaqAPI
string nameOfLibToLoad("path/to/lib/lib.so");
UeiDaqAPI = dlopen(nameOfLibToLoad.c_str(), RTLD_LAZY);
if (!lib_handle) {
cerr << "Cannot load library: " << dlerror() << endl;
}
#endif
Run Code Online (Sandbox Code Playgroud)
然而,我收到错误消息,指出头文件中定义的函数调用未定义,我怀疑这是因为它们没有添加到 .so 库中,但我不确定。
我需要一些帮助来实现上述解决方法,或者,如果有更好的方法来绕过 __declspec() 调用,那么我需要一些关于从哪里开始的指针。
我想了解更多有关链接和共享库的信息。
最后,我想知道是否可以向共享库添加方法。例如,假设有一个源文件 ac 和一个库 lib.so (没有源文件)。为了简单起见,我们进一步假设 ac 声明了一个方法,其名称不存在于 lib.so 中。我想也许可以在链接时将 ao 链接到 lib.so,同时指示创建 newLib.so,并强制链接器将 lib.so 中的所有方法/变量导出到 newLib.so 现在基本上是lib.so 以及 a.so 中添加的方法。
更一般地说,如果有一些依赖于共享库的源文件,是否可以创建一个不再依赖于共享库的单个输出文件(库或可执行文件)?(也就是说,库中的所有相关方法/变量都将被导出/链接/内联到新的可执行文件,从而使依赖项无效)。如果这是不可能的,那么技术上是什么阻止了它呢?
这里提出了一个类似的问题:合并多个 .so 共享库。其中一个回复包含以下文本:“如果您可以访问这两个库的源文件或目标文件,则可以直接编译/链接它们的组合 SO。:无需解释技术细节。这是一个错误还是确实是否成立?如果成立,该怎么办?
compiler-construction linker shared-libraries dynamic-library
我想在linux上为c ++程序创建一个动态库.在c ++程序/系统中,我使用libconfig ++库,libpqxx库,一些boost和c ++ 11.
我的步骤:1)
g++ -Wall -I/usr/local/include/ -std=c++0x -lconfig++ -Wall -lpqxx -lpq -fPIC -c ../SourceFiles/DBHandler.cpp ../SourceFiles/ParamServer.cpp ../SourceFiles/Functions.cpp
Run Code Online (Sandbox Code Playgroud)
2)
g++ -shared -Wl,-soname,libctest.so.1 -o libctest.so.1.0 *.o
Run Code Online (Sandbox Code Playgroud)
3)
ln -sf libctest.so.1.0 libctest.so.1
Run Code Online (Sandbox Code Playgroud)
4)
ln -sf libctest.so.1.0 libctest.so
Run Code Online (Sandbox Code Playgroud)
5)编译
g++ -Wall -I/path/to/include-files -L/path/to/libraries program.cpp -I/usr/local/include/ -std=c++0x -lconfig++ -lpqxx -lpq -lctest -o prog
Run Code Online (Sandbox Code Playgroud)
执行上面的命令后:
/usr/bin/ld: cannot find -lctest
collect2: ld returned 1 exit status
Run Code Online (Sandbox Code Playgroud)
我究竟做错了什么?
以下是参考: 在此处输入链接描述
我有一个BitBake recipe(example_0.1.bb),do_install其中包含一个尝试安装.so文件的任务:
do_install() {
install -d ${D}${libdir}
install -m 0644 ${S}/example.so ${D}${libdir}
}
FILES_${PN} += "${libdir}/example.so"
Run Code Online (Sandbox Code Playgroud)
这在构建过程中失败并返回:
ERROR: example not found in the base feeds
Run Code Online (Sandbox Code Playgroud)
但是,如果我将测试文件添加到包中,则.so文件和测试文件都会添加到rootfs中.
do_install() {
install -d ${D}${libdir}
install -m 0644 ${S}/example.so ${D}${libdir}
echo "bar" >> ${TOPDIR}/foo
install -m 0644 ${TOPDIR}/foo ${D}${libdir}
}
FILES_${PN} += "${libdir}/libceill.so"
FILES_${PN} += "${libdir}/foo"
Run Code Online (Sandbox Code Playgroud)
如何只添加.so没有垃圾测试文件的文件?
我使用C库在R中工作.我需要向C函数传递一个数字在1到10之间的数组,但也可能是"NA".然后在C中,取决于我需要设置输出的值.这是一个简化的代码
heredyn.load("ranking.so")
fun <- function(ranking) {
nrak <- length(ranking)
out <- .C("ranking", as.integer(nrak), as.character(ranking), rr = as.integer(vector("integer",nrak)))
out$rr
}
ranking <- sample(c(NA,seq(1,10)),10,replace=TRUE)
rr <- fun(ranking)
Run Code Online (Sandbox Code Playgroud)
C函数可以简单地如
#include <R.h>
void ranking(int *nrak, char *ranking, int *rr) {
int i ;
for (i=0;i<*nrak;i++) {
if (ranking[i] == 'NA')
rr[i] = 1 ;
else
rr[i] = (int) strtol(&ranking[i],(char **)NULL,10) ;
}
}
Run Code Online (Sandbox Code Playgroud)
由于"NA"值,我将排名设置为字符,但也许还有另一种方法,使用整数并且在调用函数之前不将"NA"替换为0?
(像这样的代码,总是给我一个零数组...)
我在 4 个不同的文件中有 4 个独立的功能。函数如下所示:
埃拉托色尼筛网.cpp
bool SieveOfEratosthenes(int n) {
//
}
Run Code Online (Sandbox Code Playgroud)
他们都没有包括。在我的 main.cpp 程序中,我有
//Includes
void compare(bool (*f)(int)) {
//
}
int main(int argc, char **argv) {
compare(isPrimeAKS);
compare(isPrimeModulo);
compare(isPrimeSQRT);
compare(SieveOfEratosthenes);
return 0;
}
Run Code Online (Sandbox Code Playgroud)
这是我的生成文件:
all: main clean
main: main.cpp lib.so
g++ -o main main.cpp -L.
lib.so: EratosthenesSieve.o AKS.o ModuloAlg.o SQRTModuloAlg.o
g++ -shared -o lib.so AKS.o ModuloAlg.o SQRTModuloAlg.o EratosthenesSieve.o
EratosthenesSieve.o: EratosthenesSieve.cpp
g++ -c -Wall -fpic EratosthenesSieve.cpp
AKS.o: AKS.cpp
g++ -c -Wall -fpic AKS.cpp
ModuloAlg.o: ModuloAlg.cpp
g++ -c -Wall -fpic …Run Code Online (Sandbox Code Playgroud)