0

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

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

/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 重新安装,但没有任何进展。据我了解,我的tomcryptlib 构建为 32 位,但我不知道如何将编译器指向 64 位。

如果 Makefile 没有tomcrypt标志,则没有错误。

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

4

1 回答 1

1

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

实际上我能够制作 64bit .nexe。问题出在 32 位 .nexe 上。我无法编译它们失败了。给出了错误消息“跳过不兼容”,我试图找到 32 位文件,但它是 64 位的。当我了解到我发现了类似的问题和解决方案提示时。

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

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

编辑以编译带有标志make_all.sh的 naclports 库-m32

首先安装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

成功!

于 2014-08-11T12:28:38.787 回答