Linux 将OpenSSL库链接到程序

Linux 将OpenSSL库链接到程序,linux,gcc,openssl,Linux,Gcc,Openssl,我已经从源代码构建了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

我已经从源代码构建了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不正确?或者我应该如何最好地解决这个问题?

愚蠢的“Linux isms”又来了!显然,我需要更改我的命令,以便
-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
为什么不使用
进行安装?如果您以前将生成的二进制文件传递给
/configure--prefix$HOME/target\u library\u install\u directory,则它可以将生成的二进制文件复制到您想要的目录中


如果您在构建和安装的每个库中都使用了此技巧,则可以将目标目录添加到
library\u PATH
环境变量中,并避免使用-L选项。

如果您使用Autotools,或者您正在构建类似
cURL
的Autoools项目,那么您应该能够使用
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` $^

另请参见和。

知道这一点很好,但我不确定这是否比在我放置
-L
的地方四处走动更容易。尽管如此,我还是投了赞成票。我会接受这个答案,因为这可能是正确的方法。在我的特殊情况下,我不希望签出我的代码(以及修改后的OpenSSL代码)的每个人都必须做任何事情,除了
make
。最后需要做的是
-lssl-lcrypto
。链接器扫描库时,仅链接已存在未定义引用的函数。所以你需要把“消费”对象放在链接行的开始,把“供应”对象放在链接行的结尾。我总是对接受自己的答案感到奇怪。不过,我现在要切换它。clan llvm的区别是什么?感谢您回答有关
pkg config
的问题。你能像我五岁一样解释一下什么是
pkg配置以及它是如何工作的吗?它是如何实现的,它自动神奇地找到所有链接,包括目录等。当然,我可以像魔术一样使用它,但它伟大的是知道它是如何工作的内部