构建共享库会改为创建静态库

时间:2017-06-08 07:26:40

标签: gcc shared-libraries mingw static-linking

我正在尝试使用MinGW-w64下的静态链接将libass构建到共享库中。当我配置

 <?php
require_once 'connection_db.php';
$response = new stdClass;
if (empty($_POST['email']) || empty($_POST['password'])) {
    $response->success = false;
    $response->message = 'Email and password cannot be empty.';
} else {
    $sql = 'SELECT * FROM `customer` WHERE `email` = ? ';

    $email = $_POST['email'];
    $password = $_POST['password'];
    $password = password_hash($password, PASSWORD_DEFAULT);
    // print_r($password, true);

    try {
        $stmt = $db->prepare($sql);
        $stmt->bind_param('s', $email);
        $stmt->execute();
        $result = $stmt->get_result();
        $array = $result->fetch_array(MYSQLI_ASSOC);
        // print_r($array, true);
        if (count($array)) {
            $response->success = true;
            $response->message = 'Login successful.';
            session_start();
            $_SESSION['email'] = $email;
            $_SESSION['id'] = $id;
            $_SESSION['current_page'] = $_SERVER['HTTP_REFERER'];
            header("Location: ". $_SESSION['current_page']);

        } else {
            $response->success = false;
            $response->message = 'Wrong username or password.';
            header("Location: index.php#test-popup");
        }
    }
    catch (Exception $e) {
        $response->success = false;
        $response->message = "Error.";
    }
}
// unset($db);
?>

它按预期生成共享库(动态链接)。但是,当我尝试通过设置

强制静态链接时
./configure --disable-static --enable-shared

而不是生成静态链接的共享库(.dll没有依赖项),它生成一个静态库(.a)。

我几乎可以肯定我拥有所有依赖的静态库,并且make过程中没有显示错误或警告消息。

任何人都可以对我做错的事情有所了解吗?

2 个答案:

答案 0 :(得分:0)

静态lib只是一个ar包。 您可以使用ar命令制作包并解压缩。

答案 1 :(得分:0)

libtool说不。

软件包的stock autotools ltmain.sh脚本解析链接标志和 如果它找到-static它将不会构建共享库,只是一个静态 之一。

它可以合理地做到最多,因为您无法静态链接共享 图书馆。共享库必须完全由位置独立(PIC)组成 代码或链接将失败,而静态链接将调用链接 非PIC目标文件,由非PIC标准和运行时库提供, 如果没有别的。

<强> foo.c的

#include <stdio.h>

void foo(void)
{
    puts("foo");
}

构建动态链接的共享库:

$ gcc -c -fPIC foo.c
$ gcc -shared -o libfoo.so foo.o
$ file libfoo.so
libfoo.so: ELF 64-bit LSB shared object, x86-64, version 1 (SYSV), \
dynamically linked, BuildID[sha1]=1adff7204d84d138a80bc4b6f3f38211e4b42812, \
not stripped

尝试构建静态链接的共享库:

$ gcc -c -fPIC foo.c
$ gcc -shared -static -o libfoo.so foo.o
/usr/bin/ld: /usr/lib/gcc/x86_64-linux-gnu/6/crtbeginT.o: \
relocation R_X86_64_32 against hidden symbol `__TMC_END__' cannot be used \
when making a shared object
/usr/bin/ld: final link failed: Nonrepresentable section on output
collect2: error: ld returned 1 exit status