Libcurl library linking failed

I am badly stuck, can someone give inputs to proceed.

because libcurl provides curl_easy_init, so you need -lcurl then try and solve your issue with ipk

Hi, there was a similar problem. I added libcurl.a and everything was going

Can you suggest me on how did you include libcurl.a with some more explanation. I am not able to add it that way to openwrt Makefile.
Thank you.

Yes, this is an OpenWrt buildroot integrity check to ensure that your program package depends on all libraries it requires. To solve that, specify DEPENDS:=+libcurl in your Package/xxx section.

i have added DEPENDS:=+libcurl it is not able to generate .ipk file. Any sample example would help. Any additional settings are env variables to be set ? It is automatically refererring to the libcurl library in /usr/lib/x86.../libcurl-gnutls-dev.so.4. When already the libcurl and its ipk are available in openwrt, why to link externally.

Actual error messages as well as your current Makefile are needed to help you here. Statements like "is not able to generate .ipk file" do not help.

My assumption is that your inner application makefile (the non-OpenWrt one) is not cross compile safe and hardcodes things like "gcc" instead of referring to $(CC)

I have code in the path package/samplepgm/src/.
The Makefile inside package/samplepgm/src is as below:

 CURL_LIB = -L~/staging_dir/target-aarch64_cortex-a53_musl/root-brcm2708/usr/lib/libcurl.so.4.5.0
samplepgm: samplepgm.o
      $(CC) $(LDFLAGS) samplepgm.o -o samplepgm $(CURL_LIB) -lcurl
  
 samplepgm.o: samplepgm.c
      $(CC) $(CFLAGS) -c samplepgm.c
  
 clean:
     rm *.o samplepgm

Outer Makefile in the path Package/Samplepgm is as below include $(TOPDIR)/rules.mk

 PKG_NAME:=samplepgm
 PKG_VERSION:=1.0.1
  
 PKG_BUILD_DIR := $(BUILD_DIR)/$(PKG_NAME)
  
 include $(INCLUDE_DIR)/package.mk
 include $(INCLUDE_DIR)/host-build.mk
  
define Package/samplepgm
    SECTION:=utils
    CATEGORY:=Utilities
    TITLE:=samplepgm
    DEPENDS:=+libcurl
endef
 
define Package/samplepgm/Default
 
endef
 
define Build/Prepare
    mkdir -p $(PKG_BUILD_DIR)
    $(CP) ./src/* $(PKG_BUILD_DIR)/
endef

define Package/samplepgmc
  $(call Package/samplepgmc/Default)
  TITLE+= (compiler)
endef
 
define Package/libsamplepgm
   $(call Package/samplepgm/Default
   SUBMENU:=
   SECTION:=libs
   CATEGORY:=Libraries
   TITLE+=(libraries)
 endef
  
 CURL_LIB:= -L~/staging_dir/target-aarch64_cortex-a53_musl/root-brcm2708/usr/lib/libcurl.so.4.5.0
 
 define Build/Compile
     $(MAKE) -C $(PKG_BUILD_DIR) $(INC) \
     LIBS+="$(CURL_LIB)" \
     LDFLAGS="$(TARGET_LDFLAGS)" \
     CFLAGS="$(TARGET_CFLAGS) " \
     $(TARGET_CONFIGURE_OPTS) \
     CROSS="$(TARGET_CROSS)" \
     ARCH="$(ARCH)" \
     $(1);
 endef
  
  define Package/samplepgm/install
     $(call Install/samplepgm,$(1))
     $(INSTALL_DIR) $(1)/usr/bin
     $(INSTALL_BIN) $(PKG_BUILD_DIR)/samplepgm $(1)/usr/bin/
  endef
  
 $(eval $(call BuildPackage,samplepgm))

package/samplepgm/Makefile [+] 1,1

Please let me know if there is any mistake. It is referring to /usr/lib libraries. Now, while typing here, i have just removed the below part from outer Makefile and compiled again and now it generated the .ipk file for my component.

define Package/libsamplepgm
$(call Package/samplepgm/Default
SUBMENU:=
SECTION:=libs
CATEGORY:=Libraries
TITLE+=(libraries)
endef

Is there a link or doc with proper of explanation on each parameter of the Makefile?

First of all remove the Build/Compile override, remove any CURL_LIB:= assignments, then proceed with make package/samplepgm/{clean,compile} V=sc and post the resulting errors here, if any.

Since you redefined Build/Compile to a manual $(MAKE) invocation, you dropped the passing of $(MAKE_FLAGS) which includes things like CC="$(TARGET_CC)" - this causes your inner Makefile to use the host compiler instead of the OpenWrt toolchain.

Now, its throwing the below error

Package samplepgm is missing dependencies for the following libraries
~openwrt_rpi/openwrt/scripts ~/staging_dir/target-aarch64_cortex-a53_musl/pkginfo
libcurl-gnutls.so.4

Makefile:81: recipe for target '~/openwrt/bin/packages/aarch64_cortex-a53/base/samplepgm_1.0.1_aarch64_cortex-a53.ipk' failed
make[2]: *** [~/openwrt/bin/packages/aarch64_cortex-a53/base/samplepgm_1.0.1_aarch64_cortex-a53.ipk] Error 1
make[2]: Leaving directory '~/openwrt/package/samplepgm'
Command exited with non-zero status 2
time: package/samplepgm/compile#0.18#0.05#0.21
package/Makefile:107: recipe for target 'package/samplepgm/compile' failed
make[1]: *** [package/samplepgm/compile] Error 2
make[1]: Leaving directory '~/openwrt'
~/openwrt/include/toplevel.mk:216: recipe for target 'package/samplepgm/compile' failed
make: *** [package/samplepgm/compile] Error 2

how can i modify that, should i not have Build/compile at all ?

The default Build/Compile recipe is usually sufficient, you can find its definition in include/package-defaults.mk.

Please ensure that package/samplepgm/src/ is clean and contains only *.c and *.h files (plus scripts, Makefiles etc. that might be required) and no *.o files or even precompiled exectuables.

The samplepgm/src is clean and dont have any .o or exe's. Though it is showing the same error.

Can i take these two parts of the package-defaults.mk -

144 define Build/Compile/Default
145 +$(MAKE_VARS)
146 $(MAKE) $(PKG_JOBS) -C $(PKG_BUILD_DIR)/$(MAKE_PATH)
147 $(MAKE_FLAGS)
148 $(1);
149 endef
150
151 define Build/Install/Default
152 $(MAKE_VARS)
153 $(MAKE) -C $(PKG_BUILD_DIR)/$(MAKE_PATH)
154 $(MAKE_INSTALL_FLAGS)
155 $(if $(1), $(1), install);
156 endef

Then provide the output of ./staging_dir/toolchain-aarch64_cortex-a53*/bin/readelf -a ./build_dir/target-aarch64_cortex-a53_musl/samplepgm*/samplepgm

You could, but there is no point in copying these recipes 1:1

ok, Thank you so much for your help. Any good link to understand the openwrt build system?

Hi. I did so.

  1. Get source files open wrt.

  2. make menuconfig check libcur and create SDK

  3. Commpiled

  4. Finded path dir with libcur.a and libcur.so

  5. To Eclipce add libcur Right butto project Settings -> Libraries top window add simle curl
    bottom add path to dir lib my path - /home/source/staging_dir/toolchain-mips_24kc_gcc-5.4.0_musl-1.1.16/lib

  6. Add Settings-> PATH /home/source/staging_dir/toolchain-mips_24kc_gcc-5.4.0_musl-1.1.16/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games:/usr/local/games

  7. Add project files curl.h and etc

Thanks Klen

Hi jow,

The above procedure working fine and generated the cross compiled binary for c program.
For c++ program, the image is generated for x86 only. Any suggestions please...

Thanks & Regards,
Saritha

Hi,
I believe I have the same issue. If you could suggest where I am wrong.
I don't know about build path or how to add to Makefile.
Openwrt compiling package depended on libcurl