我正在编写一个相当大的C++共享对象库,并遇到了一个小问题,使调试变得很麻烦:
如果我在头文件中定义一个函数/方法,并忘记为它创建一个存根(在开发期间),因为我构建为共享对象库而不是可执行文件,编译时没有出现错误告诉我我有忘记实现这个功能.我发现错误的唯一方法是在运行时,最终链接到此库的应用程序会出现"未定义的符号"错误.
我正在寻找一种简单的方法来检查我是否在编译时拥有所需的所有符号,也许我可以添加到我的Makefile中.
我提出的一个解决方案是运行已编译的库nm -C -U以获取所有未定义引用的demangled列表.问题是,这也与在其他库,如glibc的,这当然会反对与此相伴库时,最终的应用程序放在一起链接的所有引用的列表中出现.有可能使用输出nm来grep通过我的所有头文件,看看是否有任何相应的名称...但这似乎是疯了.当然,这不是一个罕见的问题,有一个更好的解决方法吗?
我被我的应用程序困住,因为我无法调试,因为它是多线程的并且因错误SIGSEGV而崩溃.我从LogCat那里获得了很多信息,它在我的本地库中提供了地址.如果我可以将这些地址转换为我的代码,将会很有帮助.
有没有人知道如何使用android-ndk提供的addr2line?
我正在尝试从VPS中的makefile编译此源代码,但它不起作用.VPS是64 Cent OS
这是完整的错误
# make
gcc -c -O3 -w -DLINUX -I../SDK/amx/ ../SDK/amx/*.c
g++ -c -O3 -w -DLINUX -I../SDK/amx/ ../SDK/*.cpp
g++ -c -O3 -w -DLINUX -I../SDK/amx/ *.cpp
g++ -O2 -fshort-wchar -shared -o "TCP_V1.so" *.o
/usr/bin/ld: TCP-LINUX_V1.o: relocation R_X86_64_32 against `.rodata.str1.8' can not be used when making a shared object; recompile with -fPIC
TCP-LINUX_V1.o: could not read symbols: Bad value
collect2: ld returned 1 exit status
make: *** [all] Error 1
Run Code Online (Sandbox Code Playgroud)
这是我的makefile:
GPP=g++
GCC=gcc
OUTFILE="TCP_V1.so"
COMPILE_FLAGS=-c -O3 -w -DLINUX -I../SDK/amx/
all: …Run Code Online (Sandbox Code Playgroud) 我正在尝试将我的程序编译成一个共享库,我可以使用ctypes在Python代码中使用它.
使用以下命令编译库:
g++ -shared -Wl,-soname,mylib -O3 -o mylib.so -fPIC [files] `pkg-config --libs --cflags opencv`
Run Code Online (Sandbox Code Playgroud)
但是,当我尝试使用ctypes导入它时
from ctypes import *
mylib = CDLL("/path/to/mylib.so")
print mylib.test() // Expected output: Hello World
Run Code Online (Sandbox Code Playgroud)
我收到以下错误:
libdc1394 error: Failed to initialize libdc1394
Run Code Online (Sandbox Code Playgroud)
这是怎么回事?
我正在使用pip并尝试安装一个名为pyodbc的python模块,它对unixodbc-dev,unixodbc-bin,unixodbc等非python库有一些依赖性.我目前无法在系统中安装这些依赖项,因为我只是在玩,所以我已将它们安装在非标准位置.我如何告诉pip在哪里寻找这些依赖项?更确切地说,如何通过包含dirs(gcc -I)和库dirs(gcc -L -l)的pip来传递信息,以便在构建pyodbc扩展时使用?
我下载了这个:https://github.com/mongodb/mongo-c-driver
现在我正在尝试在我的C程序中使用它,但我不知道如何处理生成的.a文件.这些是什么?我找不到任何信息,甚至在GCC手册中也没有.
我这样构建它:
scons --c99
Run Code Online (Sandbox Code Playgroud)
另外,我可以在C89程序中使用C99库吗?
我找到了以下命令:strings /usr/lib/libstdc++.so.6 | grep GLIBC从这里开始.它似乎工作,但这是一个ad-hoc /启发式方法.
是否有可用于查询C++库版本的特定命令?或者我找到了接受方法的方法?
Allergro是一个用于图形处理的开源C++插件库.如何将此库添加到我的编译器?
这些说明对我来说不起作用,因为我有Windows 7.我不知道操作系统是否重要.我有Visual Studio Express Edition.该库是.dll文件.如何将其添加到我的项目中?
我们遇到了一个与在Advantech POS板上使用Via C3处理器在(相当旧的)FC3下运行的Java应用程序相关的问题.java应用程序有几个已编译的共享库,可通过JNI访问.
通过C3处理器应该是i686兼容.前段时间在使用相同处理器的MiniItx主板上安装Ubuntu 6.10之后,我发现之前的声明并非100%正确.由于缺少C3处理器中i686设置的一些特定和可选指令,Ubuntu内核在启动时挂起.在使用i686优化时,GCC编译器默认使用i686集的C3实现中缺少的这些指令.在这种情况下,解决方案是使用i386编译版本的Ubuntu发行版.
Java应用程序的基本问题是通过克隆另一台PC的HD映像来安装在HD上的FC3发行版,这次是Intel P4.之后,分发需要一些黑客才能让它运行,比如用i386编译的版本替换一些软件包(例如内核).
问题是,工作一段时间后系统完全挂起而没有任何痕迹.我担心一些i686代码会留在系统中的某个地方,并且可以随时随机执行(例如从暂停模式或类似的东西中恢复后).
我的问题是:
file没有提供足够的信息.linux executable shared-libraries instruction-set cpu-architecture
shared-libraries ×10
c++ ×6
linux ×3
c ×2
gcc ×2
libraries ×2
linker ×2
python ×2
addr2line ×1
android ×1
android-ndk ×1
ctypes ×1
executable ×1
include-path ×1
libdc1394 ×1
native-code ×1
pip ×1
pyodbc ×1
visual-c++ ×1