linux - 构建 Google Chrome NaCl 应用程序 .nexe 文件时找不到有效的库

标签 linux google-chrome-extension makefile google-nativeclient libtomcrypt

问题 - 无法使用 libtomcrypt 构建 .nexe ( -ltomcrypt ) 在 64 位机器上

“跳过不兼容”或“未找到”。

/home/ME/nacl/pepper_35/toolchain/linux_x86_newlib/bin/../lib/gcc/x86_64-nacl/4.4.3/../../../../x86_64-nacl/bin/ld: skipping incompatible /home/ME/nacl/pepper_35/toolchain/linux_x86_newlib/i686-nacl/usr/lib/libtomcrypt.a when searching for -ltomcrypt
/home/ME/nacl/pepper_35/toolchain/linux_x86_newlib/bin/../lib/gcc/x86_64-nacl/4.4.3/../../../../x86_64-nacl/bin/ld: skipping incompatible /home/ME/nacl/pepper_35/toolchain/linux_x86_newlib/bin/../x86_64-nacl/usr/lib/libtomcrypt.a when searching for -ltomcrypt
/home/ME/nacl/pepper_35/toolchain/linux_x86_newlib/bin/../lib/gcc/x86_64-nacl/4.4.3/../../../../x86_64-nacl/bin/ld: cannot find -ltomcrypt

collect2: ld returned 1 exit status
make: *** [newlib/Release/my_module_unstripped_x86_32.nexe] Error 1

生成文件

下载的 nacl sdk 中现有示例的副本。用 tomcrypt 修改结果是 -ltomcrypt旗帜。

VALID_TOOLCHAINS := newlib glibc pnacl linux

NACL_SDK_ROOT ?= $(abspath $(CURDIR)/../..)

include $(NACL_SDK_ROOT)/tools/common.mk


TARGET = my_module
LIBS = ppapi_cpp ppapi pthread tomcrypt

CFLAGS = -Wall
SOURCES = my_module.cc

# Build rules generated by macros from common.mk:

$(foreach src,$(SOURCES),$(eval $(call COMPILE_RULE,$(src),$(CFLAGS))))

ifeq ($(CONFIG),Release)
$(eval $(call LINK_RULE,$(TARGET)_unstripped,$(SOURCES),$(LIBS),$(DEPS)))
$(eval $(call STRIP_RULE,$(TARGET),$(TARGET)_unstripped))
else
$(eval $(call LINK_RULE,$(TARGET),$(SOURCES),$(LIBS),$(DEPS)))
endif

$(eval $(call NMF_RULE,$(TARGET),))

我有什么

  • Linux 3.13.0-32-generic#57-Ubuntu SMP 2014 年 7 月 15 日星期二 03:51:08 UTC x86_64 x86_64 x86_64 GNU/Linux
  • my_module.cc - nacl 模块代码(不再有 .cc 文件)
    • #include <tomcrypt.h>
  • Makefile (以上)
  • ~/nacl/pepper_35/
  • ~/nacl/naclports

我尝试重新安装 libtocrypt使用 naclports,但没有任何进展。 据我了解我的tomcrypt lib 构建为 32 位,但我不知道如何指向编译器使其成为 64 位。

如果Makefile没有tomcrypt就不会报错旗帜。

我不是 Makefile 或 C++ 专业人士,但我在那里慢慢挖掘,所以最好在这个主题上为我和新手提供指导 :D

最佳答案

这实际上是一个不同的问题。 (我在发布问题后立即理解了它。.现在才能够对其进行测试)。

实际上我能够制作 64 位 .nexe。问题出在 32 位 .nexe 上。我无法编译它们失败了。给出错误消息“skipping incompatible”,我试图找到 32 位文件,但它是 64 位的。 当我明白我发现了类似的 issue and solution hint .

返回 naclports 并删除已安装的库。

$ cd naclports/src
$ ./make_all.sh clean

编辑 make_all.sh 以使用 -m32 标志编译 naclports 库

首先安装g++-multilib 以便能够编译32 位应用程序。 我有 ubuntu,所以

sudo apt-get install g++-multilib

接下来定义标志变量并将 # i686 NaCl 部分移动到结尾(因此给定的标志不会破坏另一个 64 位部分)

...
export CFLAGS
export CXXFLAGS
export LDFLAGS

...     
# i686 NaCl
NACL_ARCH=i686
TOOLCHAIN=glibc
CFLAGS="-m32"
CXXFLAGS="-m32"
LDFLAGS="-m32"
make ${TARGETS}
TOOLCHAIN=newlib
make ${TARGETS}

再次制作你的库

./make_all.sh libtomcrypt

最后制作您的 NaCl 模块

使用我在问题中复制的相同 Makefile。

$ cd my_module/
$ make
  CXX  newlib/Release/my_module_x86_32.o
  LINK newlib/Release/my_module_unstripped_x86_32.nexe
  VALIDATE newlib/Release/my_module_unstripped_x86_32.nexe
  CXX  newlib/Release/my_module_x86_64.o
  LINK newlib/Release/my_module_unstripped_x86_64.nexe
  VALIDATE newlib/Release/my_module_unstripped_x86_64.nexe
  CXX  newlib/Release/my_module_arm.o
  LINK newlib/Release/my_module_unstripped_arm.nexe
  VALIDATE newlib/Release/my_module_unstripped_arm.nexe
  STRIP newlib/Release/my_module_x86_32.nexe
  STRIP newlib/Release/my_module_x86_64.nexe
  STRIP newlib/Release/my_module_arm.nexe
  CREATE_NMF newlib/Release/my_module.nmf

成功!

关于linux - 构建 Google Chrome NaCl 应用程序 .nexe 文件时找不到有效的库,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25240358/

相关文章:

Linux 搜索子字符串命令

linux - nginx 的 apt-get 安装留下 root 拥有的文件

linux - 在包名称中找不到“software-properties-common”。尝试能力

javascript - Chrome 扩展使用 jQuery 获取本地 json

cmake - cpack 预安装输出日志

c++ - 使文件问题 : always spits out "Nothing to be done for ` make. w'。”

linux - Raspberry PI Node EventEmitter 内存泄漏

javascript - 使用 Chrome 扩展替换 jQuery 脚本

google-chrome-extension - 如何检测带有 Manifest v3 的 Chrome 扩展程序是否已卸载

makefile - 使用源子目录制作文件