我发现了一些类似的问题(如这个,那个或这个),但没有人帮我解决我的问题.我有一个*.so文件(来自gnss-sdr的核心),如下所示:
$nm libgnss_system_parameters_dyn.so | c++filt |grep Gps_Eph
Run Code Online (Sandbox Code Playgroud)
包含符号Gps_Ephemeris::Gps_Ephemeris(),它应该是一个构造函数.
我写了一些最小的代码:
#include <iostream>
#include <core/system_parameters/gps_ephemeris.h>
int main(int argc,const char* argv[])
{
Gps_Ephemeris ge;
return 0;
}
Run Code Online (Sandbox Code Playgroud)
我编译的是:
g++ main.cpp -std=c++0x -I some_include_path -L some_lib_path -l gnss_system_parameters_dyn`
Run Code Online (Sandbox Code Playgroud)
然后链接器抱怨:
/tmp/ccHCvldG.o: In function `main':
main.cpp:(.text+0x33): undefined reference to `Gps_Ephemeris::Gps_Ephemeris()'
collect2: error: ld returned 1 exit status
Run Code Online (Sandbox Code Playgroud)
我也尝试过cmake,但它生成的行类似于它(它只是-rdynamic在链接之前添加),它仍然生成完全相同的链接器错误.
请注意,库和我的最小代码都使用相同的编译器(g ++ - 5)进行编译,具有完全相同的标志和相同的c ++ 0x标准.
解决Maxim Egorushkin的答案:
nm --demangle --defined-only --extern-only libgnss_system_parameters.so |grep …Run Code Online (Sandbox Code Playgroud) 您能否告诉我如何将所有符号转储到MacOS X上的.a文件中?
我在MacOS X上编译我的c ++问题时遇到链接错误.我想知道sybmols是否存在于我链接的.a文件中.
谢谢.
Android 4.3/4.4下的"球体模式"下的相机应用程序可以将来自不同方向的照片拼接成一个球形全景,质量非常好.
结果图:
我要做的是为iPad实现具有完全相同功能的应用程序.
我尝试了两种方法:
OpenCV 2.4.8提供了一个图像拼接管道,乍一看似乎非常有前途.但是,它有两个问题:
管道处理无序输入照片,据我所知它只使用图像特征匹配来定位照片之间的几何关系,并且当空白照片(例如白墙,蓝天)上的图像特征提取失败时,管道表现不佳.但是,iPad可以提供每张拍摄照片的任意空间方向数据(虽然有噪音),但我不知道如何在OpenCV拼接管道中使用这些数据.
我无法找到一种生成180x360度全景图的方法,就像PhotoSphere使用此管道一样.向所有方向上的照片馈送管道仅产生具有弯曲图像边界的大型全景图.
我也尝试过PanoTools/Hugin lib,虽然这个lib支持预定义的照片方向,结果非常差且不稳定.此外,我尝试在Google Play上使用Focal(beta)应用,其球体模式也基于PanoTools/Hugin,他们的结果(在球体模式下)似乎并不比我们的好.
我的问题:
有没有办法在不加载的情况下读取.SO(共享对象)文件的内容?
我的用例场景是:
注意:我可以轻松地在DLL上执行这些操作.我也在Windows上工作,所以我无法加载.SO文件.
谢谢
在Windows下,当我在MSVC的DLL项目中编译C / C ++代码时,我得到2个文件:
MyDll.dllMyDll.lib据我了解,MyDll.lib其中包含某种指示符表,用于指示dll中的函数位置。使用此dll时(例如在exe文件中),MyDll.lib在链接期间会嵌入到exe文件中,因此在运行时它“知道”函数的位置MyDll.dll并可以使用它们。
但是,如果我在Linux下编译相同的代码,我只会得到一个MySo.so不带 文件的文件MySo.a(相当于libLinux中的文件),那么MySo.so如果在链接过程中未嵌入任何内容,Linux下的可执行文件如何知道函数的位置?
我正在尝试加载一个共享库(插件)我在Linux ARM平台下使用dlopen提供了(封闭源代码).我正在尝试加载这种方式:
void* handle = dlopen(<library_path>/<library_name>, RTLD_NOW);
Run Code Online (Sandbox Code Playgroud)
结果是此消息失败:
Failed to load <library_path>/<library_name>: undefined symbol: <symbol_name>.
Run Code Online (Sandbox Code Playgroud)
我试图用nm查看库内部,但似乎lib被剥离,找不到符号.我也试过使用readelf -s,事实上,我得到了这个结果:
12663: 00000000 0 NOTYPE GLOBAL DEFAULT UND <symbol_name>
Run Code Online (Sandbox Code Playgroud)
通过阅读,我得到readelf -s返回所有符号,包括在它引用的库中定义的那些符号.
这个问题的答案对我来说并不完全清楚:这是一个应该在库中的符号,它不存在,因为它是以错误的方式编译的,或者这是一个我应该在其他地方找到的符号?readelf -d的输出似乎表明我提供了所有需要的共享库.可能这个错误与我正在编译可执行文件的方式中的错误有关,或者这与加载程序无关?
另外,我读到了每列的含义,但这些值非常奇怪.你如何解释这个符号描述?为什么地址为0?为什么键入NOTYPE?
我正在尝试使用 cmake 构建我的 Android(本机)项目(从它用于构建和运行良好的 gradle 实验插件迁移它)。
我有一些本机代码(将其称为“a”),它使用另一个外部预构建库代码(将其称为“b”),并且我将两者链接如下:(根据https://developer.android.com/studio /projects/configure-cmake )
cmake_minimum_required(VERSION 3.4.1)
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -std=c++14 -frtti -fno-common -fexceptions")
include_directories(
#a's include files' paths
#b's include files' paths)
file(GLOB_RECURSE A_SOURCES
#a's source files' paths)
add_library(a_lib SHARED ${A_SOURCES})
add_library(b_lib SHARED IMPORTED)
set_target_properties(b_lib PROPERTIES IMPORTED_LOCATION "b's .so path")
target_link_libraries(a_lib b_lib)
Run Code Online (Sandbox Code Playgroud)
我通过了编译和链接步骤,android studio 继续在我的设备上安装 APK。但是,启动后,该应用程序会冻结,并在 logcat 中显示以下内容:
E/ExceptionHandler: Uncaught Exception java.lang.UnsatisfiedLinkError: dlopen failed: library "libb_lib.so" not found
at java.lang.Runtime.loadLibrary0(Runtime.java:989)
at java.lang.System.loadLibrary(System.java:1530)
at com.mm.projectname.model.libloadingclassname.<clinit>(libloadingclassname.java:99)
Run Code Online (Sandbox Code Playgroud)
我知道这是因为 b_lib 的 .so 不在 apk 中。我可以在 a 的共享库中看到 b 的符号和 …
我正在尝试使用gcc和clang来查看它们是否可以优化
#define SCOPE static
SCOPE const struct wrap_ { const int x; } ptr = { 42 /*==0x2a*/ };
SCOPE struct wrap { const struct wrap_ *ptr; } const w = { &ptr };
int ret_global(void) { return w.ptr->x; }
Run Code Online (Sandbox Code Playgroud)
返回一个中间常量.
事实证明他们可以:
0000000000000010 <ret_global>:
10: b8 2a 00 00 00 mov $0x2a,%eax
15: c3 retq
Run Code Online (Sandbox Code Playgroud)
但令人惊讶的是,移除静态会产生相同的装配输出.这让我很好奇,因为如果全局不是static它应该是可插入的并且用中间体替换引用应该防止全局变量上的位置.
确实如此:
#!/bin/sh -eu
: ${CC:=gcc}
cat > lib.c <<EOF
int ret_42(void) { return 42; }
#define SCOPE
SCOPE const struct wrap_ { …Run Code Online (Sandbox Code Playgroud) 我正在使用一个名为snort的开源项目,该项目是用Linux编写的.我正确地在netbeans中打开项目,现在我将对此源代码进行一些更改.程序的src文件夹包含几个文件夹,每个文件夹也有一些文件夹.我听说netbeans能够生成make文件.我正在对文件夹XFolder中的src文件进行一些更改,并希望在我的项目(YFolder)中的另一个文件夹中使用库函数.我包含.h文件并正确使用了该功能.
#include"../YFolder/lib.h"
Run Code Online (Sandbox Code Playgroud)
现在,当我可以编译程序时,它是好的,但是当我使用在make进程中创建的动态库".so(共享对象文件)"时; 并运行程序,我看到一个错误,这意味着我从其他未定义的文件夹中使用的函数,并看到此错误; (sfxhash_new是我调用的外部函数的名称).
libsf_sip_preproc.so:未定义的符号:sfxhash_new
我还编辑了Makefile.am并添加了该包的源代码(../YFolder/lib.c and lib.h); 但没有效果.有人可以帮我吗?
编辑:
我在文件夹src/dynamic-preprocessor/sip我想在文件中使用一个函数:src/sfutil/sfxHash.c函数名是sfxhash_new(...... ......)我正确地包含了sfxHash.h.我在Makefile.am中做了一些更改,但主要的makefile就是这个.
我的Makefile.am文件:
## $Id
AUTOMAKE_OPTIONS=foreign no-dependencies
INCLUDES = -I../include -I${srcdir}/../libs -I$(srcdir)/includes
libdir = ${exec_prefix}/lib/snort_dynamicpreprocessor
lib_LTLIBRARIES = libsf_sip_preproc.la
libsf_sip_preproc_la_LDFLAGS = -shared -export-dynamic -module @XCCFLAGS@
if SO_WITH_STATIC_LIB
libsf_sip_preproc_la_LIBADD = ../libsf_dynamic_preproc.la
else
nodist_libsf_sip_preproc_la_SOURCES = \
../include/sf_dynamic_preproc_lib.c \
../include/sf_ip.c \
endif
libsf_sip_preproc_la_SOURCES = \
spp_sip.c \
spp_sip.h \
sip_config.c \
sip_config.h \
sip_parser.c \
sip_parser.h \
sip_dialog.c \
sip_dialog.h \
sip_roptions.c \
sip_roptions.h \
sip_utils.c \
sip_utils.h \ …Run Code Online (Sandbox Code Playgroud)