标签: undefined-symbol

ld报告缺少符号,但符号似乎存在

我正在尝试将我的mac应用程序链接到精彩的libancillary库.但是,我更改了库构建脚本以创建共享库.我可以使用以下方法检查此库中的符号nm libancillary.dylib- 结果是:

libancillary.dylib(single module):
         U ___sF
         U __keymgr_get_and_lock_processwide_ptr
         U __keymgr_get_and_lock_processwide_ptr_2
         U __keymgr_set_and_unlock_processwide_ptr
         U _abort
00002cfe T _ancil_recv_fd
00002c87 T _ancil_recv_fds
00002b6a T _ancil_recv_fds_with_buffer
00002e9e T _ancil_send_fd
00002e27 T _ancil_send_fds
00002d3f T _ancil_send_fds_with_buffer
         U _calloc
         U _dlopen
         U _dlsym
         U _fflush
         U _fprintf
         U _free
         U _malloc
         U _recvmsg
         U _sendmsg
Run Code Online (Sandbox Code Playgroud)

但是,当我尝试链接我的应用程序时,我得到的输出是:

g++ -headerpad_max_install_names -framework AppKit -framework Cocoa -framework IOKit -framework CoreFoundation -framework Carbon -framework OpenGL -framework SystemConfiguration -framework Security -Wl,-bind_at_load -arch i386 -o MyApp build/app.o …
Run Code Online (Sandbox Code Playgroud)

c++ macos linker gcc undefined-symbol

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

如何使用编译的C代码编译和链接C++代码?

我希望能够使用Cmockery来模拟从我正在测试的C++代码调用的C函数.作为向前迈出的一步,我将Cmockery示例run_tests.c重命名为run_tests.cpp,并尝试使用cmockery.c进行编译和链接:

g++ -m32 -DHAVE_CONFIG_H -DPIC -I ../cmockery-0.1.2 -I /usr/include/malloc -c run_tests.cpp -o obj/run_tests.o
gcc -m32 -DHAVE_CONFIG_H -DPIC -Wno-format -I ../cmockery-0.1.2 -I /usr/include/malloc -c ../cmockery-0.1.2/cmockery.c -o obj/cmockery.o
g++  -m32 -o run_tests obj/run_tests.o obj/cmockery.o
Run Code Online (Sandbox Code Playgroud)

前两个命令行(编译)是成功的,但在最后我得到:

Undefined symbols:
  "_run_tests(UnitTest const*, unsigned long)", referenced from:
      _main in run_tests.o
ld: symbol(s) not found
collect2: ld returned 1 exit status
Run Code Online (Sandbox Code Playgroud)

该未定义的符号来自run_tests.cpp的第29行:

return run_tests(tests);
Run Code Online (Sandbox Code Playgroud)

run_tests()函数在cmockery.c中定义.

在阅读" 使用'gcc'(没有g ++)链接C++代码 "之后,我尝试了:

gcc -lstdc++ -m32 -o run_tests obj/run_tests.o obj/cmockery.o
Run Code Online (Sandbox Code Playgroud)

但得到了相同的结果:

Undefined symbols:
  "_run_tests(UnitTest const*, unsigned long)", …
Run Code Online (Sandbox Code Playgroud)

c c++ gcc undefined-symbol cmockery

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

在运行时再次“未定义的符号”,C++

我有一个数据类型,我可以实例化该类型的变量。像这样:

FetchAddr faddr(VirtualMemoryAddress( 0x0a ));
Run Code Online (Sandbox Code Playgroud)

FetchAdr 的定义是:

struct FetchAddr {
   VirtualMemoryAddress theAddress;
   FetchAddr(VirtualMemoryAddress anAddress)
     : theAddress(anAddress)
   { } 
};
Run Code Online (Sandbox Code Playgroud)

现在我有一个类 faddr 是一个私有(或公共)变量

class FLEXUS_COMPONENT(BPred)  {
   static FetchAddr faddr;
   public:
     FLEXUS_COMPONENT_CONSTRUCTOR(BPred)
        : base( FLEXUS_PASS_CONSTRUCTOR_ARGS )
     {
        faddr = VirtualMemoryAddress( 0x0a );
     }
   ...
}
Run Code Online (Sandbox Code Playgroud)

假设宏定义正确。

代码编译和链接没有任何问题。但是,当我启动程序时,它说:

 "undefined symbol: _ZN6nBPred14BPredComponent8faddr"
Run Code Online (Sandbox Code Playgroud)

它说 faddr 没有符号。

有什么想法吗?

c++ runtime undefined-symbol

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

使用NSPopovers时,Mac OS X App向后兼容性为10.6和10.7

在为Mac OS X 10.7构建应用程序但同时保持10.6兼容时,实现向后兼容性的最佳方法是什么?

我有一个应用程序,当客户端是10.7时使用NSPopover,当客户端是10.6时使用NSMenu.问题是,当在10.6机器上启动应用程序时,应用程序崩溃时出现"未找到符号"异常,并说" 在AppKit中找不到_ OBJC $ _NSPopover".我是否必须在整个应用程序中使用id来获取新功能?

objective-c backwards-compatibility undefined-symbol

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

Lua:C++模块不能引用彼此,未定义的符号

我创建了两个模块(共享对象)CPU和SaveState作为模拟器的一部分.两者都独立编译成.so文件,并在运行时通过Lua脚本使用require()加载; 即:

SaveState = require("SaveState")
CPU = require("CPU")
Run Code Online (Sandbox Code Playgroud)

在CPU中,有一个在SaveState上运行的方法:

int CPU::save_state(SaveState *state) {
    state->begin_section(savestate_namespace, savestate_data_size);

    state->write16(this->reg.af);
    state->write16(this->reg.bc);
    state->write16(this->reg.de);
    state->write16(this->reg.hl);
    state->write16(this->reg.sp);
    state->write16(this->reg.pc);
    state->write8 (this->interrupts_enabled);
    state->write8 (this->irq_flags);
    state->write8 (this->ie_flags);
    state->write8 (this->halted);
    state->write8 (this->halt_bug);
    state->write8 (this->extra_cycles);
    state->write64(this->total_cycles);
    state->write64(this->idle_cycles);

    return SaveState::OK;
}
Run Code Online (Sandbox Code Playgroud)

编译很好,但require("CPU")线路失败:

lua5.1: error loading module 'cpu' from file './src/cpu/build/cpu.so':
    ./src/cpu/build/cpu.so: undefined symbol: _ZN9SaveState7write64Ey
Run Code Online (Sandbox Code Playgroud)

使用nm -D我可以在savestate.so中看到确切的符号,但在运行时它不会出于某种原因.

c++ lua dynamic-linking dlopen undefined-symbol

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

erlang nif共享库上的未定义符号

我正在尝试将我的共享库(一个erlang nif)链接到另一个共享库(libpurple),它使用dlopen加载其他共享库(插件).

问题是mylib.so链接到libpurple.so,libpurple.so使用dlopen加载plugins.so,而plugins.so无法从libpurple.so中找到符号

1> mylib:init().
ok
2> /usr/lib/erlang/erts-6.3/bin/beam.smp: symbol lookup error: /usr/lib/purple-2/libmyspace.so: undefined symbol: purple_account_option_string_new
Run Code Online (Sandbox Code Playgroud)

我正在编译像:

gcc -fPIC -shared `pkg-config --cflags --libs purple` -I /usr/lib/erlang/erts-6.3/include -o priv/mylib.so c_src/mylib.c
Run Code Online (Sandbox Code Playgroud)

看起来问题是dlopen在erlang上调用:load_nif,这段代码和erlang nif有同样的问题,RTLD_NOW | RTLD_GLOBAL修复它,但我无法改变erlang如何调用dlopen ...

#include <dlfcn.h>
#include <stdio.h>
#include <glib.h>

void (*purple_util_set_user_dir)(const char *dir);
void (*purple_debug_set_enabled)(gboolean enabled);
gboolean (*purple_core_init)(const char *ui);

int main()
{
  void* lib = dlopen("/usr/lib/libpurple.so", RTLD_LAZY);
  purple_util_set_user_dir = dlsym(lib, "purple_util_set_user_dir");
  purple_debug_set_enabled = dlsym(lib, "purple_debug_set_enabled");
  purple_core_init = dlsym(lib, "purple_core_init");

  purple_util_set_user_dir("/tmp/purpletest");
  purple_debug_set_enabled(TRUE);
  purple_core_init("test");

  return 0;
}
Run Code Online (Sandbox Code Playgroud)

我开始工作的唯一解决方法是调用erlang,LD_PRELOAD=/usr/lib/libpurple.so erl但远非理想. …

c erlang shared-libraries dlopen undefined-symbol

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

可变参数模板的单独定义

(最后的问题)

最近,我问了一个关于如何修复链接器错误的问题(关于模板void的多个定义的重复符号).

因为我在多个源文件中使用函数,所以我建议使用关键字inline来允许标头中的声明或将声明放在已编译的源文件中.

在我意识到inline有一些不好的反响后,我把我的声明放在一个源文件中.

现在这没关系,除了可变参数模板:

template<typename T, typename... Args>
void cleanup(T *t, Args&&... args);
Run Code Online (Sandbox Code Playgroud)

我找到了一些明显的解决方案 - 但不是变量模板 - 使用.tpp文件(但它开始再次声明重复的符号)或保留源文件并添加显式实例化.

但是void cleanup有可能使用数百种参数组合,所以我不想明确地实例化所有内容.

问题: 那么,我将如何进行

  1. 将可变参数模板定义保留在源文件中,或
  2. 将定义放在.tpp文件中而不会得到重复的符号,并最终避免使用inline

.tpp声明的重复/未定义符号错误示例,并将上述模板定义分别放在源文件中.

duplicate symbol __Z7cleanupI10SDL_WindowJEEvPT_DpOT0_ in:
    CMakeFiles/Game.dir/Game/main.cc.o
    CMakeFiles/Game.dir/Game/RichTools/rtexture.cc.o
Run Code Online (Sandbox Code Playgroud)

_

Undefined symbols for architecture x86_64:
  "void cleanup<SDL_Renderer, SDL_Window*&>(SDL_Renderer*, SDL_Window*&&&)", 
referenced from:
cleanQuit() in main.cpp.o
ld: symbol(s) not found for architecture x86_64
Run Code Online (Sandbox Code Playgroud)

c++ templates undefined-symbol variadic-templates

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

nm 既是“U”又是“T”,是什么意思?

我在运行时遇到未定义的符号错误,当我在相关库中查找符号时,我得到结果:

nm -C -D /home/farmer/anaconda3/envs/general/lib/python3.6/site-packages/pyscannerbit/libScannerBitCAPI.so | grep empty_
                 U YAML::detail::node_data::empty_scalar[abi:cxx11]
00000000002b5860 T YAML::detail::node_data::empty_scalar[abi:cxx11]()
Run Code Online (Sandbox Code Playgroud)

但这怎么可能呢?该符号既未定义,又在库中?什么?或者这些实际上是不同的符号?当损坏时,名称确实略有不同:

nm -D /home/farmer/anaconda3/envs/general/lib/python3.6/site-packages/pyscannerbit/libScannerBitCAPI.so | grep empty_
                 U _ZN4YAML6detail9node_data12empty_scalarB5cxx11E
00000000002b5860 T _ZN4YAML6detail9node_data12empty_scalarB5cxx11Ev
Run Code Online (Sandbox Code Playgroud)

这有道理吗?

c++ undefined-symbol nm

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

单元测试中的"架构i386的未定义符号"

我只有在尝试构建iPhone静态库的单元测试时才会出现以下错误:

Undefined symbols for architecture i386:
  "std::terminate()", referenced from:
      -[ZipArchive dealloc] in libMyProject.a(ZipArchive.o)
  "___gxx_personality_v0", referenced from:
      Dwarf Exception Unwind Info (__eh_frame) in libMyProject.a(ZipArchive.o)
ld: symbol(s) not found for architecture i386
clang: error: linker command failed with exit code 1 (use -v to see invocation)
Run Code Online (Sandbox Code Playgroud)

构建原始项目工作正常.

我能错过什么?

应该注意的是,ZipArchive是一个引用libz.dylib框架的.mm文件,该框架在原始项目和测试项目中都被引用.

此外,通常的Build Settings嫌疑人具有以下值:

框架搜索路径:"$(SDKROOT)/ Developer/Library/Frameworks""$(DEVELOPER_LIBRARY_DIR)/ Frameworks"

其他链接器标志:-all_load -lxml2 - ObjC

标题搜索路径:/ usr/include/libxml2

iphone xcode unit-testing undefined-symbol ziparchive

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

无法将 boost 库连接到我的项目“符号查找错误”

我有以下情况:

我创建了动态库lib.so。该库使用另一个静态库lib.a。它们都使用 Boost 库(我将它们链接到 CMake 文件中)。(我在Java项目中使用这个动态库)

这是lib.so中file.cpp的代码,它从lib.a调用getFilesFromDirectory()

#include "DrawingDetector.h"
#include "../../DrawingDetection.h"
#include <vector>

#include <boost/filesystem/operations.hpp>

using namespace std;

JNIEXPORT void JNICALL Java_DrawingDetector_detectImage( JNIEnv * env, jobject, jstring jMsg)
{
    const char* msg = env->GetStringUTFChars(jMsg,0);
    vector<File> filesPic = getFilesFromDirectory(msg,0);
    env->ReleaseStringUTFChars(jMsg, msg);
}
Run Code Online (Sandbox Code Playgroud)

这是 lib.a 中 getFilesFromDirectory() 的代码:

#include <string.h>
#include <iostream>

#include <boost/filesystem/operations.hpp>

#include "DrawingDetection.h"

using namespace std;

using namespace boost;
using namespace boost::filesystem;

vector<File> getFilesFromDirectory(string dir, int status)
{
    vector<File> files;
    path directoty = path(dir);
    directory_iterator end;
    if (!exists(directoty))
    { …
Run Code Online (Sandbox Code Playgroud)

c++ java-native-interface linker boost undefined-symbol

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