TEMPORARY MODE ENABLED
New posts, edits, and any changes will not be saved during the transition period.
Registrations are temporarily disabled until the migration is complete.

  1. JackMacWindows

    OP JackMacWindows Advanced Member
    Newcomer

    Joined:
    Jan 16, 2016
    Messages:
    53
    Country:
    United States
    I have been working on porting a game I made with a friend to the 3DS. Now I am debug-compiling the port to see how many errors there are. It took me a while to find a makefile, but now when I run make, it throws the error .../armv6k/fpu/3dsx_crt0.o: In function 'ClrLoop'(.crt0+0x8c): undefined reference to 'main'. Here is the makefile:
    #---------------------------------------------------------------------------------
    .SUFFIXES:
    #---------------------------------------------------------------------------------

    ifeq ($(strip $(DEVKITARM)),)
    $(error "Please set DEVKITARM in your environment. export DEVKITARM=<path to>devkitARM")
    endif

    TOPDIR ?= $(CURDIR)
    include $(DEVKITARM)/3ds_rules

    #---------------------------------------------------------------------------------
    # TARGET is the name of the output
    # BUILD is the directory where object files & intermediate files will be placed
    # SOURCES is a list of directories containing source code
    # DATA is a list of directories containing data files
    # INCLUDES is a list of directories containing header files
    #
    # NO_SMDH: if set to anything, no SMDH file is generated.
    # APP_TITLE is the name of the app stored in the SMDH file (Optional)
    # APP_DESCRIPTION is the description of the app stored in the SMDH file (Optional)
    # APP_AUTHOR is the author of the app stored in the SMDH file (Optional)
    # ICON is the filename of the icon (.png), relative to the project folder.
    # If not set, it attempts to use one of the following (in this order):
    # - <Project name>.png
    # - icon.png
    # - <libctru folder>/default_icon.png
    #---------------------------------------------------------------------------------
    TARGET := $(notdir $(CURDIR))
    BUILD := build
    SOURCES := source
    DATA := data
    INCLUDES := include

    #---------------------------------------------------------------------------------
    # options for code generation
    #---------------------------------------------------------------------------------
    ARCH := -march=armv6k -mtune=mpcore -mfloat-abi=hard

    CFLAGS := -g -Wall -O2 -mword-relocations \
    -fomit-frame-pointer -ffast-math \
    $(ARCH)

    CFLAGS += $(INCLUDE) -DARM11 -D_3DS

    CXXFLAGS := $(CFLAGS) -fno-rtti -fno-exceptions -std=gnu++11

    ASFLAGS := -g $(ARCH)
    LDFLAGS = -specs=3dsx.specs -g $(ARCH) -Wl,-Map,$(notdir $*.map)

    LIBS := -lctru -lm

    #---------------------------------------------------------------------------------
    # list of directories containing libraries, this must be the top level containing
    # include and lib
    #---------------------------------------------------------------------------------
    LIBDIRS := $(CTRULIB)


    #---------------------------------------------------------------------------------
    # no real need to edit anything past this point unless you need to add additional
    # rules for different file extensions
    #---------------------------------------------------------------------------------
    ifneq ($(BUILD),$(notdir $(CURDIR)))
    #---------------------------------------------------------------------------------

    export OUTPUT := $(CURDIR)/$(TARGET)
    export TOPDIR := $(CURDIR)

    export VPATH := $(foreach dir,$(SOURCES),$(CURDIR)/$(dir)) \
    $(foreach dir,$(DATA),$(CURDIR)/$(dir))

    export DEPSDIR := $(CURDIR)/$(BUILD)

    CFILES := $(foreach dir,$(SOURCES),$(notdir $(wildcard $(dir)/*.c)))
    CPPFILES := $(foreach dir,$(SOURCES),$(notdir $(wildcard $(dir)/*.cpp)))
    SFILES := $(foreach dir,$(SOURCES),$(notdir $(wildcard $(dir)/*.s)))
    BINFILES := $(foreach dir,$(DATA),$(notdir $(wildcard $(dir)/*.*)))

    #---------------------------------------------------------------------------------
    # use CXX for linking C++ projects, CC for standard C
    #---------------------------------------------------------------------------------
    ifeq ($(strip $(CPPFILES)),)
    #---------------------------------------------------------------------------------
    export LD := $(CC)
    #---------------------------------------------------------------------------------
    else
    #---------------------------------------------------------------------------------
    export LD := $(CXX)
    #---------------------------------------------------------------------------------
    endif
    #---------------------------------------------------------------------------------

    export OFILES := $(addsuffix .o,$(BINFILES)) \
    $(CPPFILES:.cpp=.o) $(CFILES:.c=.o) $(SFILES:.s=.o)

    export INCLUDE := $(foreach dir,$(INCLUDES),-I$(CURDIR)/$(dir)) \
    $(foreach dir,$(LIBDIRS),-I$(dir)/include) \
    -I$(CURDIR)/$(BUILD)

    export LIBPATHS := $(foreach dir,$(LIBDIRS),-L$(dir)/lib)

    ifeq ($(strip $(ICON)),)
    icons := $(wildcard *.png)
    ifneq (,$(findstring $(TARGET).png,$(icons)))
    export APP_ICON := $(TOPDIR)/$(TARGET).png
    else
    ifneq (,$(findstring icon.png,$(icons)))
    export APP_ICON := $(TOPDIR)/icon.png
    endif
    endif
    else
    export APP_ICON := $(TOPDIR)/$(ICON)
    endif

    ifeq ($(strip $(NO_SMDH)),)
    export _3DSXFLAGS += --smdh=$(CURDIR)/$(TARGET).smdh
    endif

    .PHONY: $(BUILD) clean all

    #---------------------------------------------------------------------------------
    all: $(BUILD)

    $(BUILD):
    @[ -d [email protected] ] || mkdir -p [email protected]
    @$(MAKE) --no-print-directory -C $(BUILD) -f $(CURDIR)/Makefile

    #---------------------------------------------------------------------------------
    clean:
    @Echo clean ...
    @rm -fr $(BUILD) $(TARGET).3dsx $(OUTPUT).smdh $(TARGET).elf


    #---------------------------------------------------------------------------------
    else

    DEPENDS := $(OFILES:.o=.d)

    #---------------------------------------------------------------------------------
    # main targets
    #---------------------------------------------------------------------------------
    ifeq ($(strip $(NO_SMDH)),)
    $(OUTPUT).3dsx : $(OUTPUT).elf $(OUTPUT).smdh
    else
    $(OUTPUT).3dsx : $(OUTPUT).elf
    endif

    $(OUTPUT).elf : $(OFILES)

    #---------------------------------------------------------------------------------
    # you need a rule like this for each extension you use as binary data
    #---------------------------------------------------------------------------------
    %.bin.o : %.bin
    #---------------------------------------------------------------------------------
    @Echo $(notdir $<)
    @$(bin2o)

    # WARNING: This is not the right way to do this! TODO: Do it right!
    #---------------------------------------------------------------------------------
    %.vsh.o : %.vsh
    #---------------------------------------------------------------------------------
    @Echo $(notdir $<)
    @python $(AEMSTRO)/aemstro_as.py $< ../$(notdir $<).shbin
    @bin2s ../$(notdir $<).shbin | $(PREFIX)as -o [email protected]
    @Echo "extern const u8" `(echo $(notdir $<).shbin | sed -e 's/^\([0-9]\)/_\1/' | tr . _)`"_end[];" > `(echo $(notdir $<).shbin | tr . _)`.h
    @Echo "extern const u8" `(echo $(notdir $<).shbin | sed -e 's/^\([0-9]\)/_\1/' | tr . _)`"[];" >> `(echo $(notdir $<).shbin | tr . _)`.h
    @Echo "extern const u32" `(echo $(notdir $<).shbin | sed -e 's/^\([0-9]\)/_\1/' | tr . _)`_size";" >> `(echo $(notdir $<).shbin | tr . _)`.h
    @rm ../$(notdir $<).shbin

    -include $(DEPENDS)

    #---------------------------------------------------------------------------------------
    endif
    #---------------------------------------------------------------------------------------

    I have OS X, if that matters, with Xcode and devkitPro installed to /opt/devkitPro. What is wrong, and how is it fixed? (If you need the source code to identify the problem, please tell me.)
     
    Last edited by JackMacWindows, Jan 17, 2016
  2. JackMacWindows

    OP JackMacWindows Advanced Member
    Newcomer

    Joined:
    Jan 16, 2016
    Messages:
    53
    Country:
    United States
    The 3dsx_crt0.o comes from the 3dsx_crto.s file that is with the standard libctru download. I also tried this on another Mac with no success. I will try Windows...
     
  3. Rinnegatamante

    Rinnegatamante GBAtemp Psycho!
    Member

    Joined:
    Nov 24, 2014
    Messages:
    3,161
    Country:
    Italy
    Navigate to \devkitPro\devkitARM\arm-none-eabi\lib and launch "make CRT=3dsx" with terminal.
     
  4. JackMacWindows

    OP JackMacWindows Advanced Member
    Newcomer

    Joined:
    Jan 16, 2016
    Messages:
    53
    Country:
    United States
    It seems like something happened, but I still get the same error.
    make CRT=3dsx
    arm-none-eabi-gcc -x assembler-with-cpp -marm -c 3dsx_crt0.s -o3dsx_crt0.o
    arm-none-eabi-gcc -x assembler-with-cpp -mthumb -c 3dsx_crt0.s -o thumb/3dsx_crt0.o
     
    Last edited by JackMacWindows, Jan 23, 2016
  5. Slashcash

    Slashcash GBAtemp Fan
    Member

    Joined:
    Oct 15, 2015
    Messages:
    338
    Country:
    Italy
    Just a random thought: are the c/cpp files in a folder called source? If not: that's the reason
     
    Last edited by Slashcash, Jan 23, 2016
  6. MasterFeizz

    MasterFeizz GBAtemp Maniac
    Member

    Joined:
    Oct 15, 2015
    Messages:
    1,081
    Country:
    United States
    Its not a problem with 3dsx_crt0.o, its a problem with your sources. You haven't defined the main() function, or you are not compiling the file in which its defined.
     
  7. JackMacWindows

    OP JackMacWindows Advanced Member
    Newcomer

    Joined:
    Jan 16, 2016
    Messages:
    53
    Country:
    United States
    int main(int argc, char** argv[]) {

    Right after the function definitions. Is that the wrong type for argv? It also didn't work without the arguments.

    EDIT: I tried somebody else's (int argc, char **argv), but it didn't work either.
     
    Last edited by JackMacWindows, Jan 23, 2016
  8. MasterFeizz

    MasterFeizz GBAtemp Maniac
    Member

    Joined:
    Oct 15, 2015
    Messages:
    1,081
    Country:
    United States
    char** argv[] is wrong.
    It should be one of the following
    Code:
    char** argv
    char* argv[]
    or main could also take no argument
    Code:
    int main(void)
    
     
  9. JackMacWindows

    OP JackMacWindows Advanced Member
    Newcomer

    Joined:
    Jan 16, 2016
    Messages:
    53
    Country:
    United States
    Still not right, error is still occurring.

    — Posts automatically merged - Please don't double post! —

    No, they are not in a source folder. And it worked. Thanks!
     
  10. Slashcash

    Slashcash GBAtemp Fan
    Member

    Joined:
    Oct 15, 2015
    Messages:
    338
    Country:
    Italy
    Take a look at this line of the Makefile:

    Code:
    SOURCES := source
    The compiler will scan the folder listed after the := symbol for source files. You could add multiple folders by adding paths separated by a space
     
  11. Zer0Entry

    Zer0Entry Newbie
    Newcomer

    Joined:
    Jan 23, 2017
    Messages:
    1
    Country:
    United States
    What do you mean by "are the c/cpp files in a folder called source?" and how would I do that?
     
Draft saved Draft deleted
Loading...

Hide similar threads Similar threads with keywords - Compiling, homebrew, throws