我正在尝试将我的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) 我希望能够使用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) 我有一个数据类型,我可以实例化该类型的变量。像这样:
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 没有符号。
有什么想法吗?
在为Mac OS X 10.7构建应用程序但同时保持10.6兼容时,实现向后兼容性的最佳方法是什么?
我有一个应用程序,当客户端是10.7时使用NSPopover,当客户端是10.6时使用NSMenu.问题是,当在10.6机器上启动应用程序时,应用程序崩溃时出现"未找到符号"异常,并说" 在AppKit中找不到_ OBJC $ _NSPopover".我是否必须在整个应用程序中使用id来获取新功能?
我创建了两个模块(共享对象)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中看到确切的符号,但在运行时它不会出于某种原因.
我正在尝试将我的共享库(一个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但远非理想. …
(最后的问题)
最近,我问了一个关于如何修复链接器错误的问题(关于模板void的多个定义的重复符号).
因为我在多个源文件中使用函数,所以我建议使用关键字inline来允许标头中的声明或将声明放在已编译的源文件中.
在我意识到inline有一些不好的反响后,我把我的声明放在一个源文件中.
现在这没关系,除了可变参数模板:
template<typename T, typename... Args>
void cleanup(T *t, Args&&... args);
Run Code Online (Sandbox Code Playgroud)
我找到了一些明显的解决方案 - 但不是变量模板 - 使用.tpp文件(但它开始再次声明重复的符号)或保留源文件并添加显式实例化.
但是void cleanup有可能使用数百种参数组合,所以我不想明确地实例化所有内容.
问题: 那么,我将如何进行
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) 我在运行时遇到未定义的符号错误,当我在相关库中查找符号时,我得到结果:
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)
这有道理吗?
我只有在尝试构建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
我有以下情况:
我创建了动态库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) undefined-symbol ×10
c++ ×7
c ×2
dlopen ×2
gcc ×2
linker ×2
boost ×1
cmockery ×1
erlang ×1
iphone ×1
lua ×1
macos ×1
nm ×1
objective-c ×1
runtime ×1
templates ×1
unit-testing ×1
xcode ×1
ziparchive ×1