相关疑难解决方法(0)

如何找出从共享对象导出的所有符号?

我有一个共享对象(DLL).如何找出从中导出的所有符号?

linux shared-libraries

123
推荐指数
7
解决办法
16万
查看次数

虽然符号出现在*.so文件中,但是g ++未定义引用

我发现了一些类似的问题(如这个,那个这个),但没有人帮我解决我的问题.我有一个*.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)

c++ g++ name-mangling undefined-reference

36
推荐指数
2
解决办法
3562
查看次数

如何将符号转储到.a文件中

您能否告诉我如何将所有符号转储到MacOS X上的.a文件中?

我在MacOS X上编译我的c ++问题时遇到链接错误.我想知道sybmols是否存在于我链接的.a文件中.

谢谢.

c++ macos

32
推荐指数
2
解决办法
2万
查看次数

Android 4.3/4.4上的Google PhotoSphere背后的算法

Android 4.3/4.4下的"球体模式"下的相机应用程序可以将来自不同方向的照片拼接成一个球形全景,质量非常好.

结果图:

我要做的是为iPad实现具有完全相同功能的应用程序.

我尝试了两种方法:

OpenCV 2.4.8

OpenCV 2.4.8提供了一个图像拼接管道,乍一看似乎非常有前途.但是,它有两个问题:

  1. 管道处理无序输入照片,据我所知它只使用图像特征匹配来定位照片之间的几何关系,并且当空白照片(例如白墙,蓝天)上的图像特征提取失败时,管道表现不佳.但是,iPad可以提供每张拍摄照片的任意空间方向数据(虽然有噪音),但我不知道如何在OpenCV拼接管道中使用这些数据.

  2. 我无法找到一种生成180x360度全景图的方法,就像PhotoSphere使用此管道一样.向所有方向上的照片馈送管道仅产生具有弯曲图像边界的大型全景图.

PanoTools

我也尝试过PanoTools/Hugin lib,虽然这个lib支持预定义的照片方向,结果非常差且不稳定.此外,我尝试在Google Play上使用Focal(beta)应用,其球体模式也基于PanoTools/Hugin,他们的结果(在球体模式下)似乎并不比我们的好.


我的问题:

  1. 是否有任何库可以执行Google的PhotoSphere所做的工作?由于我不开发商业用途,任何开源库都是可以接受的.
  2. 有没有好的算法(或技术报告,学者论文)?如果有,哪一个最好?
  3. Google如何实现自己的PhotoSphere?任何建议表示赞赏.

algorithm panoramas image-stitching photosphere

16
推荐指数
1
解决办法
5670
查看次数

有没有办法在不加载的情况下读取.so文件的内容?

有没有办法在不加载的情况下读取.SO(共享对象)文件的内容?

我的用例场景是:

  1. 我在Windows上有一个.so文件.我需要查询一些方法,无论它们是否存在于.so中.
  2. 要了解.so文件中的所有类.
  3. 给定一个类名需要找到这个类的所有方法.

注意:我可以轻松地在DLL上执行这些操作.我也在Windows上工作,所以我无法加载.SO文件.

谢谢

c++ shared-libraries shared-objects

10
推荐指数
2
解决办法
3万
查看次数

动态链接-Linux与。视窗

在Windows下,当我在MSVC的DLL项目中编译C / C ++代码时,我得到2个文件:

  1. MyDll.dll
  2. MyDll.lib

据我了解,MyDll.lib其中包含某种指示符表,用于指示dll中的函数位置。使用此dll时(例如在exe文件中),MyDll.lib在链接期间会嵌入到exe文件中,因此在运行时它“知道”函数的位置MyDll.dll并可以使用它们。

但是,如果我在Linux下编译相同的代码,我只会得到一个MySo.so不带 文件的文件MySo.a(相当于libLinux中的文件),那么MySo.so如果在链接过程中未嵌入任何内容,Linux下的可执行文件如何知道函数的位置?

c c++ linux windows shared-libraries

10
推荐指数
2
解决办法
179
查看次数

尝试使用dlopen加载库时未定义的符号

我正在尝试加载一个共享库(插件)我在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?

c++ linker compilation shared-libraries dlopen

8
推荐指数
2
解决办法
1万
查看次数

java.lang.UnsatisfiedLinkError: dlopen failed: library not found

我正在尝试使用 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 的符号和 …

android build cmake shared-libraries android-gradle-3.1.0

6
推荐指数
2
解决办法
8661
查看次数

全局const优化和符号插入

我正在尝试使用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)

c compiler-construction optimization linker elf

6
推荐指数
1
解决办法
126
查看次数

包括C语言中的头文件和编译

我正在使用一个名为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)

c netbeans shared-libraries include snort

5
推荐指数
1
解决办法
2426
查看次数