2013-03-29 56 views
5

Tôi đang cố gắng để liên kết với các phiên bản tĩnh của libs các POCO C++ như thế này:poco C++ vấn đề liên kết tĩnh với tài liệu tham khảo không xác định cho các biểu tượng

g++ BCCMain.o -L$_POCO_LIBS -Wl,-Bstatic $_POCO_LIBS/libPocoFoundation.a $_POCO_LIBS/libPocoUtil.a $_POCO_LIBS/libPocoXML.a $_POCO_LIBS/libPocoJSON.a -Wl,-Bdynamic -o BCMain 

Unfortunatelly này cung cấp cho các lỗi về một số tài liệu tham khảo không xác định cho các biểu tượng như:

Poco::Logger::get(std::basic_string<char, std::char_traits<char>, std::allocator<char> > const&) 

mặc dù Poco::Logger::get(std::string const&) thực sự IS được xác định trong libPocoFoundation.a.

Bây giờ nếu tôi cố gắng liên kết đến một phiên bản chia sẻ của nền tảng lib nó hoạt động:

g++ BCCMain.o -L$_POCO_LIBS -Wl,-Bstatic $_POCO_LIBS/libPocoFoundation.a $_POCO_LIBS/libPocoUtil.a $_POCO_LIBS/libPocoXML.a $_POCO_LIBS/libPocoJSON.a -Wl,-Bdynamic -lPocoFoundation -o BCMain 

phiên bản tĩnh và chia sẻ của libs có những biểu tượng giống nhau vì vậy tôi thấy khó để hình dung những gì tôi làm sai.

Ubuntu/Linaro. g ++ 4.6.3

+0

tôi cũng xác định POCO_STATIC khi biên dịch. Không giúp được gì. – gregee123

Trả lời

1

Tôi đã giải quyết được điều này bằng cách tách biên dịch và liên kết. Đây là những gì tôi trông giống như:

Compile: g++ -c -std=c++0x -ggdb -I/home/bbogart/src/of_v0071_linux64_release/libs/poco/include pkg-config opencv --cflags *.cpp

liên kết: g++ *.o -L/home/bbogart/src/of_v0071_linux64_release/libs/poco/lib/linux64/ -lPocoNet -lPocoUtil -lPocoFoundation -lopencv_gpu pkg-config opencv --libs -o cameraGrabber

Lưu ý rằng bạn bỏ qua "lib" và ".a" từ các tên lib.

14

Kinh nghiệm của tôi là thứ tự liên kết các thư viện Poco là quan trọng khi được liên kết tĩnh. Có vẻ như Quỹ quan trọng là nền tảng cuối cùng.

Trình tự làm việc cho tôi là:

  1. util
  2. Net
  3. XML
  4. Foundation
+0

Gah! Cảm ơn bạn, đây là nó! – Cameron

+0

Có, thứ tự liên kết tĩnh với gcc là quan trọng và phải tính đến các phụ thuộc nội bộ giữa các lib đó. Nó không chỉ là một vấn đề POCO, mà là một hành vi chung trong liên kết tĩnh gcc. Trong trường hợp này Util phụ thuộc vào XML (bạn có thể kiểm tra nó trong mã), ví dụ, và tất cả các lib phụ thuộc vào Foundation. Các lib độc lập xuất hiện đầu tiên, và các yêu cầu của các thư viện đó phải theo sau chúng. – drodri

+2

Ngoài ra còn có PocoJSON nên được giữa Util và Net thư viện. – Bogolt