2013-08-12 73 views
7

Tôi đã viết các ứng dụng đơn giản với Openssl trong C và C++. Tôi biên dịch chúng như sau:Ứng dụng liên kết tĩnh với Openssl C/C++ [x86_x64]

gcc openssltest.c -o openssltest -lcrypto 
g++ openssltest.cpp -o openssltest -lcrypto 

Và tất cả đều ổn nhưng chỉ khi bạn đã cài đặt Openssl.

Tôi muốn biên dịch nó mà tôi có thể chạy chúng trên hệ điều hành mà ở đó không có instensnd Openssl (hệ điều hành giống Linux). Tôi cố gắng này:

gcc -c openssltest.c -lcrypto -static 
gcc openssltest.o -o openssltest -lcrypto -static 

và tương tự cho C++:

g++ -c openssltest.cpp -lcrypto -static 
g++ openssltest.o -o openssltest -lcrypto -static 

Nhưng có những lỗi:

/usr/lib/gcc/x86_64-linux-gnu/4.7/../../../x86_64-linux-gnu/libcrypto.a(dso_dlfcn.o): In function `dlfcn_globallookup': 
(.text+0x19): undefined reference to `dlopen' 
/usr/lib/gcc/x86_64-linux-gnu/4.7/../../../x86_64-linux-gnu/libcrypto.a(dso_dlfcn.o): In function `dlfcn_globallookup': 
(.text+0x2c): undefined reference to `dlsym' 
/usr/lib/gcc/x86_64-linux-gnu/4.7/../../../x86_64-linux-gnu/libcrypto.a(dso_dlfcn.o): In function `dlfcn_globallookup': 
(.text+0x37): undefined reference to `dlclose' 
/usr/lib/gcc/x86_64-linux-gnu/4.7/../../../x86_64-linux-gnu/libcrypto.a(dso_dlfcn.o): In function `dlfcn_bind_func': 
(.text+0x354): undefined reference to `dlsym' 
/usr/lib/gcc/x86_64-linux-gnu/4.7/../../../x86_64-linux-gnu/libcrypto.a(dso_dlfcn.o): In function `dlfcn_bind_func': 
(.text+0x3fb): undefined reference to `dlerror' 
/usr/lib/gcc/x86_64-linux-gnu/4.7/../../../x86_64-linux-gnu/libcrypto.a(dso_dlfcn.o): In function `dlfcn_bind_var': 
(.text+0x474): undefined reference to `dlsym' 
/usr/lib/gcc/x86_64-linux-gnu/4.7/../../../x86_64-linux-gnu/libcrypto.a(dso_dlfcn.o): In function `dlfcn_bind_var': 
(.text+0x52e): undefined reference to `dlerror' 
/usr/lib/gcc/x86_64-linux-gnu/4.7/../../../x86_64-linux-gnu/libcrypto.a(dso_dlfcn.o): In function `dlfcn_load': 
(.text+0x5a2): undefined reference to `dlopen' 
/usr/lib/gcc/x86_64-linux-gnu/4.7/../../../x86_64-linux-gnu/libcrypto.a(dso_dlfcn.o): In function `dlfcn_load': 
(.text+0x60b): undefined reference to `dlclose' 
/usr/lib/gcc/x86_64-linux-gnu/4.7/../../../x86_64-linux-gnu/libcrypto.a(dso_dlfcn.o): In function `dlfcn_load': 
(.text+0x638): undefined reference to `dlerror' 
/usr/lib/gcc/x86_64-linux-gnu/4.7/../../../x86_64-linux-gnu/libcrypto.a(dso_dlfcn.o): In function `dlfcn_pathbyaddr': 
(.text+0x6cd): undefined reference to `dladdr' 
/usr/lib/gcc/x86_64-linux-gnu/4.7/../../../x86_64-linux-gnu/libcrypto.a(dso_dlfcn.o): In function `dlfcn_pathbyaddr': 
(.text+0x731): undefined reference to `dlerror' 
/usr/lib/gcc/x86_64-linux-gnu/4.7/../../../x86_64-linux-gnu/libcrypto.a(dso_dlfcn.o): In function `dlfcn_unload': 
(.text+0x78a): undefined reference to `dlclose' 
/usr/lib/gcc/x86_64-linux-gnu/4.7/../../../x86_64-linux-gnu/libcrypto.a(c_zlib.o): In function `bio_zlib_free': 
(.text+0x4d): undefined reference to `inflateEnd' 
/usr/lib/gcc/x86_64-linux-gnu/4.7/../../../x86_64-linux-gnu/libcrypto.a(c_zlib.o): In function `bio_zlib_free': 
(.text+0x6b): undefined reference to `deflateEnd' 
/usr/lib/gcc/x86_64-linux-gnu/4.7/../../../x86_64-linux-gnu/libcrypto.a(c_zlib.o): In function `bio_zlib_ctrl': 
(.text+0x284): undefined reference to `deflate' 
/usr/lib/gcc/x86_64-linux-gnu/4.7/../../../x86_64-linux-gnu/libcrypto.a(c_zlib.o): In function `bio_zlib_ctrl': 
(.text+0x342): undefined reference to `zError' 
/usr/lib/gcc/x86_64-linux-gnu/4.7/../../../x86_64-linux-gnu/libcrypto.a(c_zlib.o): In function `zlib_stateful_expand_block': 
(.text+0x411): undefined reference to `inflate' 
/usr/lib/gcc/x86_64-linux-gnu/4.7/../../../x86_64-linux-gnu/libcrypto.a(c_zlib.o): In function `zlib_stateful_compress_block': 
(.text+0x4ca): undefined reference to `deflate' 
/usr/lib/gcc/x86_64-linux-gnu/4.7/../../../x86_64-linux-gnu/libcrypto.a(c_zlib.o): In function `zlib_stateful_finish': 
(.text+0x51f): undefined reference to `inflateEnd' 
/usr/lib/gcc/x86_64-linux-gnu/4.7/../../../x86_64-linux-gnu/libcrypto.a(c_zlib.o): In function `zlib_stateful_finish': 
(.text+0x528): undefined reference to `deflateEnd' 
/usr/lib/gcc/x86_64-linux-gnu/4.7/../../../x86_64-linux-gnu/libcrypto.a(c_zlib.o): In function `zlib_stateful_init': 
(.text+0x5d7): undefined reference to `inflateInit_' 
/usr/lib/gcc/x86_64-linux-gnu/4.7/../../../x86_64-linux-gnu/libcrypto.a(c_zlib.o): In function `zlib_stateful_init': 
(.text+0x659): undefined reference to `deflateInit_' 
/usr/lib/gcc/x86_64-linux-gnu/4.7/../../../x86_64-linux-gnu/libcrypto.a(c_zlib.o): In function `bio_zlib_read': 
(.text+0x893): undefined reference to `inflate' 
/usr/lib/gcc/x86_64-linux-gnu/4.7/../../../x86_64-linux-gnu/libcrypto.a(c_zlib.o): In function `bio_zlib_read': 
(.text+0x90d): undefined reference to `zError' 
/usr/lib/gcc/x86_64-linux-gnu/4.7/../../../x86_64-linux-gnu/libcrypto.a(c_zlib.o): In function `bio_zlib_read': 
(.text+0x97c): undefined reference to `inflateInit_' 
/usr/lib/gcc/x86_64-linux-gnu/4.7/../../../x86_64-linux-gnu/libcrypto.a(c_zlib.o): In function `bio_zlib_write': 
(.text+0xa6f): undefined reference to `deflate' 
/usr/lib/gcc/x86_64-linux-gnu/4.7/../../../x86_64-linux-gnu/libcrypto.a(c_zlib.o): In function `bio_zlib_write': 
(.text+0xaec): undefined reference to `zError' 
/usr/lib/gcc/x86_64-linux-gnu/4.7/../../../x86_64-linux-gnu/libcrypto.a(c_zlib.o): In function `bio_zlib_write': 
(.text+0xb7e): undefined reference to `deflateInit_' 
collect2: error: ld returned 1 exit status 

Làm thế nào tôi có thể làm điều này? Tôi nhớ rằng một lúc trước tôi đã làm điều này nhưng bây giờ, erm, quên làm thế nào để làm điều đó. Im trên Ubuntu 13.04 x64 - nó có thể là vấn đề không?

+0

thử thêm '-ldl -lz' – billz

+0

@billz: 'gcc -static -o openssltest openssltest.c -ldl -lz -lcrypto' cho cùng một lỗi mà tôi đã đăng – yak

+1

-ldl -lz nên sau khi -lcrypto – billz

Trả lời

0

Một hotfix: cố gắng liên kết trong libdl theo phương thức tĩnh.

Nếu cách này không hoạt động, IMHO libcrypto.a của bạn bị biên dịch kém.

-2

Tôi gặp vấn đề tương tự như bạn. Dưới đây là các lệnh mà giải quyết nó cho tôi:

gcc yourfile.c -o yourfile -static -lcrypto -lz -ldl 

Nó tạo ra cảnh báo này:

/usr/lib/gcc/i686-linux-gnu/4.7/../../../i386-linux-gnu/libcrypto.a(dso_dlfcn.o): In function `dlfcn_globallookup': (.text+0x1b): warning: Using 'dlopen' in statically linked applications requires at runtime the shared libraries from the glibc version used for linking 

nhưng thực thi vẫn hoạt động.

+0

Miễn là bạn có libgcc/libc libs sẵn có sẵn trên thiết bị đích của bạn, chắc chắn nó sẽ hoạt động - nhưng nếu bạn không phải chịu số phận. Vì vậy, trên thực tế nó có nghĩa là nhị phân không hoàn toàn tĩnh - cũng không phải là một giải pháp. – drahnr

+0

Bạn nói "chắc chắn nó sẽ làm việc" và sau đó kết thúc với "đây không phải là một giải pháp". Trong cuốn sách của tôi, nếu một cái gì đó hoạt động, đó là một giải pháp. – schulwitz

+0

Vì bạn loại trừ một thứ không rõ ràng. Không phải mọi hệ thống (đặc biệt là hệ thống nhúng) không nhất thiết bao gồm libgcc. Lưu ý rằng "chắc chắn nó sẽ hoạt động" là một phần của câu lệnh "if". – drahnr

1

Bạn cần lưu ý rằng thư viện cần có sẵn dưới dạng tệp * .a được liên kết tĩnh. Nếu không, thì trình biên dịch sẽ không thành công hoặc bạn kết thúc với một tệp thực thi được liên kết động.

Nếu đây trở nên quá nhiều Pita (tất cả các thư viện phụ thuộc cần phải được biên dịch tĩnh để, và DEPS của họ quá và vân vân) sử dụng một cái gì đó giống như buildroot

2

Tôi đã có một vấn đề tương tự cố gắng tĩnh biên dịch một DES đơn giản chương trình bằng cách sử dụng lib openssl. Tôi đã sử dụng "-lcrypto -lz -ldl -static-libgcc" và nó đã làm việc cho tôi. Không có cảnh báo hoặc lỗi.

+0

nó hoạt động, Cảm ơn! bạn có thể cập nhật câu trả lời của mình hay không, đề cập đến thứ tự có liên quan. – Zskdan