Home Php C# Sql C C++ Javascript Python Java Go Android Git Linux Asp.net Django .net Node.js Ios Xcode Cocoa Iphone Mysql Tomcat Mongodb Bash Objective-c Scala Visual-studio Apache Elasticsearch Jar Eclipse Jquery Ruby-on-rails Ruby Rubygems Android-studio Spring Lua Sqlite Emacs Ubuntu Perl Docker Swift Amazon-web-services Svn Html Ajax Xml Java-ee Maven Intellij-idea Rvm Macos Unix Css Ipad Postgresql Css3 Json Windows-server Vue.js Typescript Oracle Hibernate Internet-explorer Github Tensorflow Laravel Symfony Redis Html5 Google-app-engine Nginx Firefox Sqlalchemy Lucene Erlang Flask Vim Solr Webview Facebook Zend-framework Virtualenv Nosql Ide Twitter Safari Flutter Bundle Phonegap Centos Sphinx Actionscript Tornado Register | Login | Edit Tags | New Questions | 繁体 | 简体


5 questions online user: 7

0
votes
answers
49 views
+10

內存對齊保證

1

以下代碼可交叉編譯內存對齊保證

struct Foo { 
    alignas(1) char c1; 
    alignas(1) char c2; 
    alignas(4) int i; 
}; 
static_assert(sizeof(Foo) == (sizeof(int) + 4), "No cross-compilable"); 

換句話說,是保證sizeof(Foo) == (sizeof(int) + 4)不管什麼架構/平臺?

+0

嚴格來說?我會說不。我不相信對齊規範否定了填充選項。 – StoryTeller

+0

@StoryTeller我考慮到了'+ 4'(就是填充「+ 2」)。 –

+1

是的,就是這樣。填充沒有綁定,真的。不可能超過您指定的數量,但不是真正的約束。 – StoryTeller

沙发
0
2

不能保證。這將在今天的許多體系結構上工作,但在具有8字節int(在8字節邊界上對齊)的系統上這不起作用。在這種情況下,你應該得到一個編譯器診斷,因爲你試圖對int應用一個不太嚴格的對齊;看[dcl.align]。

+0

請問您能否提供更多關於爲什麼在「8字節int arch」上無效的細節? –

+0

@BiagioFesta如果一個'int'有8個字節的對齊,那麼'Foo'中'i'的偏移量將是8,並且sizeof(Foo)將是16. – 1201ProgramAlarm

+0

你是對的!那麼'alignof(int)+ sizeof(int)== sizeof(Foo)'會是正確的嗎? (注意:'int'的'alignas(4)'被刪除) –

0
votes
answers
44 views
+10

arm linux gnueabi找不到`-lz`

-1

我試圖用arm-linux-gnueabi和cmake編譯代碼。當我處於鏈接階段時,我收到以下錯誤: arm-linux-gnueabi/bin/ld: cannot find -lzarm linux gnueabi找不到`-lz`

這是我在cmake的文件鏈接部分:

target_link_libraries(myprogram libboost_system.a libboost_thread.a libssl.a libcrypto.a z dl) 

編輯:我試圖安裝使用sudo apt-get install zlib1g-dev的Z庫,但錯誤依然存在。

+0

試試'lib32z1-dev'或'libz-dev'。我認爲第一個爲我工作。 – ibriq

沙发
0
0

我管理通過使用該命令從源代碼構建編譯它:

export CROSS=arm-none-linux-gnueabi 
export CC=${CROSS}-gcc 
export LD=${CROSS}-ld 
./configure --prefix=/home/<your user>/workbench/zlib/final 
make 
make install 

我爲了編譯使用該guide

0
votes
answers
47 views
+10

特拉維斯MIPS交叉編譯

3

如何設置一個.travis.yml爲MIPS目標交叉編譯?對於PowerPC,這是微不足道的:特拉維斯MIPS交叉編譯

addons: 
    apt: 
     packages: 
     - gcc-powerpc-linux-gnu 

由於我有權訪問軟件包directly

對於MIPS我無法在Ubuntu忠實的找到一個編譯器爲它:

即使它似乎被列入白名單:

看來我需要一個更新的Ubuntu圖像(上特拉維斯不可能):

的替代的解決方案將是使用一些預建立MIPS編譯器,例如:

但文件明確地,而不是說緩存那些事:

大文件是安裝迅速,但是進展緩慢,下載做 受益於高速緩存,因爲他們採取只要從緩存 從下載原始來源:

  • Android SDK
  • Debian軟件包
  • JDK軟件包
  • 編譯的二進制文件
  • 泊塢窗圖像

你如何安裝Ubuntu默認特拉維斯圖像上的MIPS交叉編譯?


更新我嘗試了天真的解決方案:

addons: 
    apt: 
    sources: 
    - debian-sid 
    packages: 
    - gcc-mips-linux-gnu 

但這種失敗:

dpkg-deb: error: archive '/var/cache/apt/archives/gcc-7-base_7.2.0-18_amd64.deb' has premature member 'control.tar.xz' before 'control.tar.gz', giving up 
dpkg: error processing archive /var/cache/apt/archives/gcc-7-base_7.2.0-18_amd64.deb (--unpack): 
subprocess dpkg-deb --control returned error exit status 2 

看來dpkg在Ubuntu /忠實的將不支持這些DEB文件:

沙发
0
1

看來我不能使用基於的,因爲這個要求的容器,我放棄了,只是用:

sudo: true 
dist: trusty 

addons: 
    apt: 
    packages: 
    - u-boot-tools 

before_install: 
    - sudo add-apt-repository -y "deb http://archive.ubuntu.com/ubuntu/ xenial main universe" 
    - sudo apt-get -qq update 
    - sudo apt-get install -qq gcc-mips-linux-gnu 

我仍然一個事實,即gcc-mips-linux-gnu是明確列入白名單的興趣。

7
votes
answers
44 views
+10

ActionScript到Javascript交叉編譯器[關閉]

大約六個??月前我學習了ActionScript和FlashBuilder,最近又聽說過谷歌的GWT和關閉。但在深入研究java之前,我想知道是否有任何類似於GWT的項目,但是使用ActionScript作為開發語言而不是java。是否有一個ActionScript-to-javascript交叉編譯器或一個可以使用SWF並生成javascript與javascript UI庫通信的工具,因此Flash插件變得不必要了?

沙发
+50

看看Haxe:

http://haxe.org

這兩種語言(非常接近ActionScript)和編譯器。編寫Haxe代碼,您可以編譯為SWF,JavaScript,PHP,C ++和Neko。

值得一看!

感謝Haxe鏈接。 - 蒂姆2010年4月10日11:37

板凳
+20

另一個需要考慮的因素: http://www.jangaroo.net

地板
0

查看Zynga的 PlayScript 是一個針對Mono,C ++和JavaScript的ActionScript的開源實現

4楼
0

http://timwhitlock.info/tag/jaspa/ - 蒂姆的個人項目維特洛克

343
votes
answers
29 views
+10

交叉編譯Go OSX?

我試圖在OSX上交叉編譯一個go app來為windows和linux構建二進製文件。我已經閱讀了網上可以找到的所有內容。我發現的最近的例子已經發表(除了許多未完成的關於瘋狂郵件列表的討論): http://solovyov.net/en/2012/03/09/cross-compiling-go/ 但它不適用於我的安裝。我去了1.0.2。由於1.0.2是最新版本,因此我認為以上所有示例都不適用於此版本。 嘗試將./make.bash --no-cleanENV變量設置為386 / windows,它確實構建了go,但它構建用於我的安裝,這darwin/amd64完全忽略了ENV中設置的構建不同編譯器的內容。 有人建議如何做(如果可以完成)?
up vote 119 down vote accepted favorite
沙发
+1190
+50

使用Go 1.5,它們似乎改進了交叉編譯過程,這意味著它現在已經內置。不需要./make.bashbrew不需要。這裡描述這個過程但對於TLDR-ers(像我一樣):你只需設置GOOSGOARCH環境變量並運行go build。

對於那些更加懶散的複制貼紙(像我一樣),如果你在* nix系統上做這樣的事情:

env GOOS=linux GOARCH=arm go build -v github.com/path/to/your/app

你甚至學會了這個env技巧,它讓你只為該命令設置環境變量,完全免費。

env命令僅在自定義環境中運行該調用,並在完成後“重置”它。例如,運行導出GOOS = windows,然後是帶或不帶env和echo $ GOOS的命令。隨著env GOOS沒有改變。 - meonlol 2016年6月13日9:17

在沒有環境的情況下也是如此(至少在Bash中)。我運行導出GOOS = windows然後GOOS = linux bash -c'echo“GOOS:$ GOOS”'然後回顯“GOOS:$ GOOS”。env是否提供與其他shell方言或其他平台的更好兼容性?如果不是這裡似乎是多餘的。 - davidchambers 2016年6月13日14:43

@davidchambers在BASH中它們是等價的。而在其他一些Shell中,例如FISH shell,它不支持FOO = bar cmd,因此你必須使用env FOO = bar cmd。因此我認為使用env FOO = bar cmd的最大優點是兼容性。 - PickBoy 2016年12月1日12:12

難以置信的答案就在這裡。你解決了我的問題,教了我一個新的伎倆,讓我自言自語。 - T Blank 2017年1月16日6:07

很好的答案,謝謝!為了編譯在heroku(intel x86)上使用,我稍微修改了一行到env GOOS = linux GOARCH = 386 go build -v github.com/path/to/your/app它就像一個冠軍--Ira Herman Aug 18 '17在19:19

+1340

感謝golang-nuts的親切和耐心的幫助,配方如下:

1)需要為不同的目標平台和體系結構編譯Go編譯器。這是在go安裝中從src文件夾完成的。在我的案例中,Go安裝就位於/usr/local/go編譯需要發布make實用程序的編譯器在此之前,您需要了解一些注意事項。

交叉編譯時存在關於CGO庫的問題,因此需要禁用CGO庫。

編譯是通過將位置更改為源目錄來完成的,因為編譯必須在該文件夾中完成

cd /usr/local/go/src

然後編譯Go編譯器:

sudo GOOS=windows GOARCH=386 CGO_ENABLED=0 ./make.bash --no-clean

您需要通過更改GOOS和GOARCH參數,為希望交叉編譯的每個操作系統和體系結構重複此步驟。

如果您像我一樣在用戶模式下工作,則需要sudo,因為Go編譯器位於系統目錄中。否則,您需要以超級用戶身份登錄。在Mac上,您可能需要啟用/配置SU訪問(默認情況下不可用),但如果您已設法安裝Go,則可能已具有root訪問權限。

2)一旦構建了所有交叉編譯器,您就可以通過使用以下設置來愉快地交叉編譯應用程序,例如:

GOOS=windows GOARCH=386 go build -o appname.exe appname.go

GOOS=linux GOARCH=386 CGO_ENABLED=0 go build -o appname.linux appname.go

將GOOS和GOARCH更改為您要構建的目標。

如果您遇到CGO問題,請在命令行中包含CGO_ENABLED = 0。另請注意,linux和mac的二進製文件沒有擴展名,因此您可以添加擴展名以便擁有不同的文件。-o開關指示Go使輸出文件類似於c / c ++的舊編譯器,因此上面使用的appname.linux可以是任何其他擴展。

最初讓我感到困惑的是,在編譯的第一部分中說:#為主機構建編譯器和Go bootstrap工具,darwin / amd64但後來它實際上最終為:---在/ usr / local中安裝Go for windows / 386 / go / usr / local / go / bin中的已安裝命令,因此必須觀察結束而不是開始編譯編譯器。 - ljgww 2012年8月30日18:23

一切都是通過嘗試來做的:$ GOARCH = 386 GOOS = linux go build app.go並收到錯誤#timetime /usr/local/go/src/pkg/runtime/extern.go:137:undefined:theGoos / usr / local /go/src/pkg/runtime/extern.go:137:在const初始化程序中不能使用Goos作為類型字符串 - ljgww 2012年8月30日18:38

Homebrew中的Go包有一個選項“--cross-compile-all”,它將自動構建所有交叉編譯器。 - nimrodm 2014年4月28日19:30

很棒的提示@nimrodm!重新編譯你的安裝,你需要運行brew重新安裝go --cross-compile-all - linqu 2015年1月14日在17:06

@ljgww'sudo'沒有配置ENV。我最終在/ usr / local / go / pkg / linux_amd64 /上使用chown / - Nuno Silva 2015年10月9日12:51

+630

如果你在OS X上使用Homebrew,那麼你有一個更簡單的解決方案:

$ brew install go --with-cc-common # Linux, Darwin, and Windows

要么..

$ brew install go --with-cc-all # All the cross-compilers

reinstall如果您已經go安裝,請使用

注意到更新的開關是:--cross-compile-all為所有支持的平台構建交叉編譯器和運行時支持--cross-compile-common為darwin,linux和windows構建交叉編譯器和運行時支持 - Chip Tol Feb 17 '15在16:48

--cross-compile-all現在是--with-cc-all - gianebao 2015年5月13日8:32

@ sheeks06 - 修復。謝謝! - docwhat 2015年5月14日15:09

我所知道的這些旗幟不再存在。我看到的唯一相關選項是--without-cgo :( - rdegges 2015年9月24日5:23

從Go 1.5開始,沒有單獨的交叉編譯器,你現在只使用標誌tip.golang.org/doc/go1.5#compiler_and_tools - chuckus 2016年7月4日14:27

+190

您可以使用Docker輕鬆完成此操作,因此無需額外的庫。只需運行此命令:

docker run --rm -it -v "$GOPATH":/go -w /go/src/github.com/iron-io/ironcli golang:1.4.2-cross sh -c '
for GOOS in darwin linux windows; do
  for GOARCH in 386 amd64; do
    echo "Building $GOOS-$GOARCH"
    export GOOS=$GOOS
    export GOARCH=$GOARCH
    go build -o bin/ironcli-$GOOS-$GOARCH
  done
done
'

您可以在以下文章中找到更多詳細信息:https//medium.com/iron-io-blog/how-to-cross-compile-go-programs-using-docker-beaa102a316d

為什麼有人想安裝Docker來執行此操作時,他們可以在env上執行shell循環GOOS = x GOARCH = y go install something / ...並以$ GOPATH / bin / $ GOOS_ $ GOARCH下的相應二進製文件結束?? 而BTW,Go支持的不僅僅是你列出的三個操作系統,為什麼不喜歡BSD? - Dave C 2015年7月9日13:03

你不會只是為了這樣安裝Docker,但是如果你擁有它,這比替代方案更容易和更清潔。 - Travis Reeder 2015年7月9日23:38

+50

對於需要啟用CGO並從OSX目標窗口進行交叉編譯的人員

因為我導入了https://github.com/mattn/go-sqlite3並且需要它,所以我需要在從我的mac編譯窗口時啟用CGO根據其他答案編譯給了我和錯誤:

/usr/local/go/src/runtime/cgo/gcc_windows_amd64.c:8:10: fatal error: 'windows.h' file not found

如果你像我一樣,你必須用CGO編譯。這就是我做的:

1.我們將使用CGO依賴庫交叉編譯Windows。首先我們需要安裝一個交叉編譯器mingw-w64

brew install mingw-w64

這可能會在這里安裝它/usr/local/opt/mingw-w64/bin/

2.就像其他答案一樣,我們首先需要將windows arch添加到我們的go編譯器工具鏈中。編譯編譯器需要編譯器(奇怪的句子)編譯go編譯器需要一個單獨的預構建編譯器。我們可以在一個文件夾中下載一個預構建的二進製文件或從源代碼構建,例如:~/Documents/go 現在我們可以改進我們的Go編譯器,根據最佳答案,但這次使用CGO_ENABLED=1和我們單獨的預構建編譯器GOROOT_BOOTSTRAP(Pooya是我的用戶名):

cd /usr/local/go/src
sudo GOOS=windows GOARCH=amd64 CGO_ENABLED=1 GOROOT_BOOTSTRAP=/Users/Pooya/Documents/go ./make.bash --no-clean
sudo GOOS=windows GOARCH=386 CGO_ENABLED=1 GOROOT_BOOTSTRAP=/Users/Pooya/Documents/go ./make.bash --no-clean

3.編譯我們的Go代碼時,用於mingw編譯啟用了CGO的go文件定位窗口:

GOOS="windows" GOARCH="386" CGO_ENABLED="1" CC="/usr/local/opt/mingw-w64/bin/i686-w64-mingw32-gcc" go build hello.go
GOOS="windows" GOARCH="amd64" CGO_ENABLED="1" CC="/usr/local/opt/mingw-w64/bin/x86_64-w64-mingw32-gcc" go build hello.go
+30

為許多平台創建可執行文件的過程可能有點乏味,所以我建議使用腳本:

#!/usr/bin/env bash

package=$1
if [[ -z "$package" ]]; then
  echo "usage: $0 <package-name>"
  exit 1
fi
package_name=$package

#the full list of the platforms: https://golang.org/doc/install/source#environment
platforms=(
"darwin/386"
"dragonfly/amd64"
"freebsd/386"
"freebsd/amd64"
"freebsd/arm"
"linux/386"
"linux/amd64"
"linux/arm"
"linux/arm64"
"netbsd/386"
"netbsd/amd64"
"netbsd/arm"
"openbsd/386"
"openbsd/amd64"
"openbsd/arm"
"plan9/386"
"plan9/amd64"
"solaris/amd64"
"windows/amd64"
"windows/386" )

for platform in "${platforms[@]}"
do
    platform_split=(${platform//// })
    GOOS=${platform_split[0]}
    GOARCH=${platform_split[1]}
    output_name=$package_name'-'$GOOS'-'$GOARCH
    if [ $GOOS = "windows" ]; then
        output_name+='.exe'
    fi

    env GOOS=$GOOS GOARCH=$GOARCH go build -o $output_name $package
    if [ $? -ne 0 ]; then
        echo 'An error has occurred! Aborting the script execution...'
        exit 1
    fi
done

我只在OSX上檢查了這個腳本

gist - go-executable-build.sh