将 OpenSSL 库链接到程序

发布于 2024-10-05 23:30:55 字数 677 浏览 3 评论 0原文

我已经从源代码构建了 OpenSSL(故意使用旧版本;使用 ./config && make && make test 构建),并且更愿意使用我构建的内容而不执行 make install 链接到我的程序。

失败的命令是:

gcc -Wall -Wextra -Werror -static -Lopenssl/openssl-0.9.8k/ -lssl -lcrypto 
-Iopenssl/openssl-0.9.8k/include -o myApp source1.o source2.o common.o`

我收到一系列类似于以下内容的错误:

common.c:(.text+0x1ea): undefined reference to `SSL_write'

这让我觉得我的 OpenSSL 有点奇怪。如果我从命令中省略 -Lopenssl/openssl-0.9.8k/,错误将更改为无法:

/usr/bin/ld: cannot find -lssl
/usr/bin/ld: cannot find -lcrypto

我是否错误地编译了 OpenSSL?或者我应该如何最好地解决这个问题?

I have built OpenSSL from source (an intentionally old version; built with ./config && make && make test) and would prefer to use what I have built without doing make install to link against my program.

The command that's failing is:

gcc -Wall -Wextra -Werror -static -Lopenssl/openssl-0.9.8k/ -lssl -lcrypto 
-Iopenssl/openssl-0.9.8k/include -o myApp source1.o source2.o common.o`

And I receive a series of errors similar to:

common.c:(.text+0x1ea): undefined reference to `SSL_write'

This makes me think there's something funky with my OpenSSL. If I omit -Lopenssl/openssl-0.9.8k/ from my command, the error changes to being unable to:

/usr/bin/ld: cannot find -lssl
/usr/bin/ld: cannot find -lcrypto

Am I compiling OpenSSL incorrectly? Or how should I best resolve this?

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(4

孤千羽 2024-10-12 23:30:55

愚蠢的“Linux主义”再次袭来!显然,我需要更改我的命令,以便 -L-l 内容在末尾(尽管 man gcc 似乎表明):

gcc -Wall -Wextra -Werror -static -o myApp source1.o source2.o common.o -Lopenssl/openssl-0.9.8k/ -lssl -lcrypto -Iopenssl/ openssl-0.9.8k/include

Silly "Linux-isms" strike again! Apparently, I need to change my command such that the -L and -l stuff is at the end like (despite what man gcc seems to indicate):

gcc -Wall -Wextra -Werror -static -o myApp source1.o source2.o common.o -Lopenssl/openssl-0.9.8k/ -lssl -lcrypto -Iopenssl/openssl-0.9.8k/include

靑春怀旧 2024-10-12 23:30:55

为什么不想使用make install?如果您之前将生成的二进制文件传递给 ./configure --prefix $HOME/target_library_install_directory

如果您对构建和安装的每个库都使用了此技巧,则它可以将生成的二进制文件复制到您想要的目录中,然后您可以添加将目标目录添加到 LIBRARY_PATH 环境变量中,并避免使用 -L 选项。

Why don't you want to use make install? It can copy generated binaries in the directory you want if you previously passed it to ./configure --prefix $HOME/target_library_install_directory

If you used this trick with every library you build and install, you could then add the target directory to the LIBRARY_PATH environment variable and avoid using -L option.

九八野马 2024-10-12 23:30:55

如果您使用 Autotools,或者正在构建像 cURL 这样的 Autools 项目,那么您应该能够使用 pkg-config。这个想法是 Autotools 包将读取 OpenSSL 的包配置,并且一切都会为您“正常工作”。

OpenSSL 包配置库名称为 openssl

您可以像在基于 makefile 的项目中一样使用它。

%.o: %.c
        $(CC) -o $@ -c `pkg-config --cflags openssl` $^

target: foo.o bar.o baz.o
        $(CC) -o $@ `pkg-config --libs openssl` $^

另请参阅如何在 Make 中使用 pkg-config如何使用 pkg-config 静态链接库

If you use Autotools, or you are building an Autools project like cURL, then you should be able to use pkg-config. The idea is the Autotools package will read OpenSSL's package configuration and things will "just work" for you.

The OpenSSL package configuration library name is openssl.

You would use it like so in a makefile based project.

%.o: %.c
        $(CC) -o $@ -c `pkg-config --cflags openssl` $^

target: foo.o bar.o baz.o
        $(CC) -o $@ `pkg-config --libs openssl` $^

Also see How to use pkg-config in Make and How to use pkg-config to link a library statically.

清引 2024-10-12 23:30:55

另一种方法是使用 pkg-config 来保持兼容性。这是需要链接 OpenSSL 时的 makefile 示例。

CC = gcc
CFLAGS = \
    -I. \
    -D_GNU_SOURCE=1

LDFLAGS = `pkg-config --libs inih`
LDFLAGS += `pkg-config --libs libcurl`
LDFLAGS += `pkg-config --libs liburiparser`
LDFLAGS += `pkg-config --libs openssl`


# Executable
foo: foo.o
    $(CC) -o $@ $^ $(LDFLAGS)


foo.o: foo.c 
    $(CC) -c $(CFLAGS) 
lt; -o $@ 

Another approach is to use pkg-config to preserve compatibility. This is an example of makefile when needs to link OpenSSL.

CC = gcc
CFLAGS = \
    -I. \
    -D_GNU_SOURCE=1

LDFLAGS = `pkg-config --libs inih`
LDFLAGS += `pkg-config --libs libcurl`
LDFLAGS += `pkg-config --libs liburiparser`
LDFLAGS += `pkg-config --libs openssl`


# Executable
foo: foo.o
    $(CC) -o $@ $^ $(LDFLAGS)


foo.o: foo.c 
    $(CC) -c $(CFLAGS) 
lt; -o $@ 

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文