MacOSX 共享库:体系结构的未定义符号 x86_64
MacOSX shared libraries: Undefined symbols for architecture x86_64
我在 MacOSX 上使用共享库编译代码时遇到一些问题。
在尝试在 MacOSX 上编译之前,我首先在 Debian 上编写它。
代码如下:
test.hxx:
#ifndef TEST_HXX
#define TEST_HXX
namespace test
{
class CFoo
{
/* data */
public:
CFoo (){}
virtual ~CFoo (){}
void bar();
}; /* CFoo */
} /* namespace test */
#endif /* TEST_HXX */
test.cxx:
#include <iostream>
#include "test.hxx"
void test::CFoo::bar()
{
std::cout << "Hello world!" << std::endl;
} /* bar() */
other.hxx:
#ifndef OTHER_HXX
#define OTHER_HXX
namespace other
{
class CBar
{
public:
CBar (){}
virtual ~CBar (){}
void foo();
}; /* CBar */
} /* namespace other */
#endif /* OTHER_HXX */
other.cxx:
#include <iostream>
#include "test.hxx"
#include "other.hxx"
void other::CBar::foo()
{
test::CFoo c;
c.bar();
} /* bar() */
main.cxx:
#include "other.hxx"
int main (int argc, const char *argv[])
{
other::CBar c;
c.foo();
return 0;
} /* main () */
还有一个简单的 makefile:
LIBTEST = libtest.so
LIBOTHER = libother.so
all: $(LIBTEST) $(LIBOTHER)
g++ -ltest -lother -I. -L. main.cxx
libtest.so: test.o
g++ -shared test.o -o $(LIBTEST)
libother.so: other.o
g++ -shared other.o -o $(LIBOTHER)
test.o: test.cxx test.hxx
g++ -fPIC -c test.cxx
other.o: other.cxx other.hxx
g++ -fPIC -c other.cxx
clean:
$(RM) $(LIBOTHER) $(LIBTEST) test.o other.o a.out
所以我主要是创建对象 test.o
和 other.o
并从它们创建两个共享库(每个对象一个)。
other.cxx
使用 test.cxx
中包含的 class 来打印 Hello world
.
所以这个 makefile 和代码在我的 Debian 上运行良好,但是当我尝试在 MacOSX 上编译它时出现编译错误:
g++ -fPIC -c test.cxx
g++ -shared test.o -o libtest.so
g++ -fPIC -c other.cxx
g++ -shared other.o -o libother.so
Undefined symbols for architecture x86_64:
"test::CFoo::bar()", referenced from:
other::CBar::foo() in other.o
ld: symbol(s) not found for architecture x86_64
clang: error: linker command failed with exit code 1 (use -v to see invocation)
make: *** [libother.so] Error 1
它为 test
编译并创建我的共享库,但在创建 libother.so
时失败。
当只使用一个共享库时(因此直接从 test
打印 main
中的 Hello world
)它工作得很好,但是当使用多个共享库时就会出现问题...
我不是 Apple 用户,以前从未在 MacOSX 上工作过,所以我不太了解链接是如何完成的。而且这个错误对我来说真的没有意义...
感谢您帮助我理解这个错误!
这是因为 libother
使用了 libtest
但您没有 link 使用它。尝试
g++ -shared other.o -o libother.so -L. -ltest
-L
告诉编译器在何处搜索库,-l
link 与它一起。
我在 MacOSX 上使用共享库编译代码时遇到一些问题。 在尝试在 MacOSX 上编译之前,我首先在 Debian 上编写它。
代码如下:
test.hxx:
#ifndef TEST_HXX
#define TEST_HXX
namespace test
{
class CFoo
{
/* data */
public:
CFoo (){}
virtual ~CFoo (){}
void bar();
}; /* CFoo */
} /* namespace test */
#endif /* TEST_HXX */
test.cxx:
#include <iostream>
#include "test.hxx"
void test::CFoo::bar()
{
std::cout << "Hello world!" << std::endl;
} /* bar() */
other.hxx:
#ifndef OTHER_HXX
#define OTHER_HXX
namespace other
{
class CBar
{
public:
CBar (){}
virtual ~CBar (){}
void foo();
}; /* CBar */
} /* namespace other */
#endif /* OTHER_HXX */
other.cxx:
#include <iostream>
#include "test.hxx"
#include "other.hxx"
void other::CBar::foo()
{
test::CFoo c;
c.bar();
} /* bar() */
main.cxx:
#include "other.hxx"
int main (int argc, const char *argv[])
{
other::CBar c;
c.foo();
return 0;
} /* main () */
还有一个简单的 makefile:
LIBTEST = libtest.so
LIBOTHER = libother.so
all: $(LIBTEST) $(LIBOTHER)
g++ -ltest -lother -I. -L. main.cxx
libtest.so: test.o
g++ -shared test.o -o $(LIBTEST)
libother.so: other.o
g++ -shared other.o -o $(LIBOTHER)
test.o: test.cxx test.hxx
g++ -fPIC -c test.cxx
other.o: other.cxx other.hxx
g++ -fPIC -c other.cxx
clean:
$(RM) $(LIBOTHER) $(LIBTEST) test.o other.o a.out
所以我主要是创建对象 test.o
和 other.o
并从它们创建两个共享库(每个对象一个)。
other.cxx
使用 test.cxx
中包含的 class 来打印 Hello world
.
所以这个 makefile 和代码在我的 Debian 上运行良好,但是当我尝试在 MacOSX 上编译它时出现编译错误:
g++ -fPIC -c test.cxx
g++ -shared test.o -o libtest.so
g++ -fPIC -c other.cxx
g++ -shared other.o -o libother.so
Undefined symbols for architecture x86_64:
"test::CFoo::bar()", referenced from:
other::CBar::foo() in other.o
ld: symbol(s) not found for architecture x86_64
clang: error: linker command failed with exit code 1 (use -v to see invocation)
make: *** [libother.so] Error 1
它为 test
编译并创建我的共享库,但在创建 libother.so
时失败。
当只使用一个共享库时(因此直接从 test
打印 main
中的 Hello world
)它工作得很好,但是当使用多个共享库时就会出现问题...
我不是 Apple 用户,以前从未在 MacOSX 上工作过,所以我不太了解链接是如何完成的。而且这个错误对我来说真的没有意义...
感谢您帮助我理解这个错误!
这是因为 libother
使用了 libtest
但您没有 link 使用它。尝试
g++ -shared other.o -o libother.so -L. -ltest
-L
告诉编译器在何处搜索库,-l
link 与它一起。